Home > Blockchain >  How to use rvest in R to extract a dataframe considering the example HTML page?
How to use rvest in R to extract a dataframe considering the example HTML page?

Time:04-18

I have this: html

Below, a small representation of the available link:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <title>Busca Textual - Currículo Lattes</title>
                                <div >
                                    <ol type="1" start="1">
                                        <li><div  alt="Score: indicador da freqüência relativa dos termos de busca sobre o(s) currículo(s) encontrados."><div ><div style="width:100%"></div></div><div  style="font-size:9px; font-weight:normal">100%</div></div><b><a href="javascript:abreDetalhe(&#39;K4247104P1&#39;,&#39;Beatriz_Castro_Dias_Cuyabano&#39;,11678670,)">Beatriz Castro Dias Cuyabano</a></b>&nbsp;<br>Doutorado em Quantitative Genetics and Biostatistics pela Aarhus University, Dinamarca(2014)<br>Pesquisadora do Institut National de la Recherche Agronomique , França<br><br></li>
<li><div  alt="Score: indicador da freqüência relativa dos termos de busca sobre o(s) currículo(s) encontrados."><div ><div style="width:99%"></div></div><div  style="font-size:9px; font-weight:normal">99%</div></div><b><a href="javascript:abreDetalhe(&#39;K4440769J3&#39;,&#39;Fernando_Domingues_Kümmel_Tria&#39;,35889969,)">Fernando Domingues Kümmel Tria</a></b>&nbsp;<br>Doutorado em Evolução molecular pelo Christian-Albrechts-Universität zu Kiel, Alemanha(2018)<br><br></li>
<li><div  alt="Score: indicador da freqüência relativa dos termos de busca sobre o(s) currículo(s) encontrados."><div ><div style="width:99%"></div></div><div  style="font-size:9px; font-weight:normal">99%</div></div><b><a href="javascript:abreDetalhe(&#39;K4437977A8&#39;,&#39;Isadora_Alonso_Correa&#39;,29437672,)">Isadora Alonso Correa</a></b>&nbsp;<br><span  alt="Pesquisador com bolsa de desenvolvimento tecnológico e industrial vigente no CNPq">Bolsista de Desenvolvimento Tecnológico Industrial A</span><br>Doutorado em Ciências (Microbiologia) pela Universidade Federal do Rio de Janeiro, Brasil(2020)<br>Aluno mestrado da Universidade Federal do Rio de Janeiro , Brasil<br><br></li>
<li><div  alt="Score: indicador da freqüência relativa dos termos de busca sobre o(s) currículo(s) encontrados."><div ><div style="width:99%"></div></div><div  style="font-size:9px; font-weight:normal">99%</div></div><b><a href="javascript:abreDetalhe(&#39;K4275806J6&#39;,&#39;Yuri_Tani_Utsunomiya&#39;,19925978,)">Yuri Tani Utsunomiya</a></b>&nbsp;<br>Doutorado em Medicina Veterinária (Reprodução Animal) pela Universidade Estadual Paulista Júlio de Mesquita Filho, FCAV-Jaboticabal, Brasil(2017)<br>Jovem Docente Permanente, FMVA-UNESP da Universidade Estadual Paulista Júlio de Mesquita Filho , Brasil<br><br></li>
</ol></div>
</body></html>

Html view:

100%
Beatriz Castro Dias Cuyabano 
Doutorado em Quantitative Genetics and Biostatistics pela Aarhus University, Dinamarca(2014)
Pesquisadora do Institut National de la Recherche Agronomique , França

99%
Fernando Domingues Kümmel Tria 
Doutorado em Evolução molecular pelo Christian-Albrechts-Universität zu Kiel, Alemanha(2018)

99%
Isadora Alonso Correa 
Bolsista de Desenvolvimento Tecnológico Industrial A
Doutorado em Ciências (Microbiologia) pela Universidade Federal do Rio de Janeiro, Brasil(2020)
Aluno mestrado da Universidade Federal do Rio de Janeiro , Brasil

99%
Yuri Tani Utsunomiya 
Doutorado em Medicina Veterinária (Reprodução Animal) pela Universidade Estadual Paulista Júlio de Mesquita Filho, FCAV-Jaboticabal, Brasil(2017)
Jovem Docente Permanente, FMVA-UNESP da Universidade Estadual Paulista Júlio de Mesquita Filho , Brasil

How to create a dataframe a with the following structure in R:

# name CAPES graduation inf1 country.Grad year inf2 inf3 country
1 Beatriz Castro Dias Cuyabano NA Doutorado em Quantitative Genetics and Biostatistics pela Aarhus University NA Dinamarca 2014 NA Pesquisadora do Institut National de la Recherche Agronomique França
2 Fernando Domingues Kümmel Tria NA Doutorado em Evolução molecular pelo Christian-Albrechts-Universität zu Kiel NA Alemanha 2018 NA NA NA
3 Isadora Alonso Correa Bolsista de Desenvolvimento Tecnológico Industrial A Doutorado em Ciências (Microbiologia) pela Universidade Federal do Rio de Janeiro NA Brasil 2020 NA Aluno mestrado da Universidade Federal do Rio de Janeiro Brasil
4 Yuri Tani Utsunomiya NA Doutorado em Medicina Veterinária (Reprodução Animal) pela Universidade Estadual Paulista Júlio de Mesquita Filho FCAV-Jaboticabal Brasil 2017 Jovem Docente Permanente FMVA-UNESP da Universidade Estadual Paulista Júlio de Mesquita Filho Brasil
... ... ... ... ... ... ... ... ... ...
info <- html %>% 
    html_nodes(xpath = '/html/body/div/ol') %>%
    html_elements(.,"li")%>% data.frame()

I'm using this code, but without success. how to make this dataframe correctly?

CodePudding user response:

I can get you this far, but you'll need a reliable and robust regex to separate the text that is currently in text1 and text2 into the desired columns of the data:

library(rvest)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
html <- read_html("~/Documents/tmp.html")

h <- html %>% 
  html_nodes(xpath = '/html/body/div/ol')

name <- h %>% html_elements(.,"li a") %>% 
  html_text()

l <- h %>% 
  html_elements(.,"li") 
capes <- lapply(l, function(x)x %>% 
                     html_elements("span") %>% 
                     html_text())
capes <- sapply(capes, function(x)ifelse(length(x) == 0, "", x))

other <- h %>% html_elements(.,"li") %>% 
  sapply(., function(x)x %>% 
                       html_elements(xpath = "text()") %>% 
                       html_text())

o2 <- sapply(other, function(x)x[2])
o3 <- sapply(other, function(x)ifelse(length(x) == 3, x[3], ""))


out <- data.frame(name = name, 
                 CAPES = capes, 
                 text1 = o2, 
                 text2 = o3)

out
#>                              name
#> 1    Beatriz Castro Dias Cuyabano
#> 2 Fernando Domingues Kümmel Tria
#> 3           Isadora Alonso Correa
#> 4            Yuri Tani Utsunomiya
#>                                                   CAPES
#> 1                                                      
#> 2                                                      
#> 3 Bolsista de Desenvolvimento Tecnológico Industrial A
#> 4                                                      
#>                                                                                                                                                   text1
#> 1                                                          Doutorado em Quantitative Genetics and Biostatistics pela Aarhus University, Dinamarca(2014)
#> 2                                                       Doutorado em Evolução molecular pelo Christian-Albrechts-Universität zu Kiel, Alemanha(2018)
#> 3                                                      Doutorado em Ciências (Microbiologia) pela Universidade Federal do Rio de Janeiro, Brasil(2020)
#> 4 Doutorado em Medicina Veterinária (Reprodução Animal) pela Universidade Estadual Paulista Júlio de Mesquita Filho, FCAV-Jaboticabal, Brasil(2017)
#>                                                                                                      text2
#> 1                                  Pesquisadora do Institut National de la Recherche Agronomique , França
#> 2                                                                                                         
#> 3                                        Aluno mestrado da Universidade Federal do Rio de Janeiro , Brasil
#> 4 Jovem Docente Permanente, FMVA-UNESP da Universidade Estadual Paulista Júlio de Mesquita Filho , Brasil

Created on 2022-04-17 by the reprex package (v2.0.1)

CodePudding user response:

I think I have included everything except "CAPES", "inf1" and "inf2".

page <- read_html("https://prequest.websiteseguro.com/tests/")

data <- tibble(
  number = 1:length(page %>% html_nodes("li a") %>% html_text2()),
  name = page %>% html_nodes("li a") %>% html_text2(),
  graduation = 1:length(page %>% html_nodes("li a") %>% html_text2()) %>%
    map( ~ page %>%
           html_element(
             xpath = paste0("/html/body/div[1]/ol/li[",
                            .x, "]/text()[2]")
           ) %>%
           html_text2) %>%
    unlist,
  inf3 = 1:length(page %>% html_nodes("li a") %>% html_text2()) %>%
    map( ~ page %>%
           html_element(
             xpath = paste0("/html/body/div[1]/ol/li[",
                            .x, "]/text()[3]")
           ) %>%
           html_text2) %>%
    unlist
) %>% 
  separate(sep = "(, )(?!.*\\1)", 
           col = graduation, 
           into = c("graduation", "grad_country")) %>% 
  separate(col = grad_country, 
           sep = "\\(", 
           into = c("grad_country", "year")) %>%  
  mutate(year = year %>% parse_number()) %>%  
  separate(col = inf3, 
           sep = "(, )(?!.*\\1)", 
           into = c("inf3", "country"))

Output
    # A tibble: 5,349 x 7
       number name                                      graduation                                                                     grad_country  year inf3  country
        <int> <chr>                                     <chr>                                                                          <chr>        <dbl> <chr> <chr>  
     1      1 Beatriz Castro Dias Cuyabano              Doutorado em Quantitative Genetics and Biostatistics pela Aarhus University    Dinamarca     2014 "Pes~ França 
     2      2 Caroline Mello Pimentel Schuabb           Doutorado em Ciências Naturais pelo Technische Universität Dortmund            Alemanha      2016 "Pro~ Brasil 
     3      3 Eduardo da Cruz Gouveia Pimentel          Doutorado em Zootecnia (Producao Animal) pela Universidade Estadual Paulista ~ Brasil        2007 "Wis~ Aleman~
     4      4 Julio Scliar Rerin                        Doutorado em Medicina pela University of Münster                               Alemanha      2001 "Méd~ Brasil 
     5      5 Márcio Fernando Ribeiro de Resende Júnior Doutorado em Genetics and Genomics pela University of Florida                  Estados Uni~  2014 "Ass~ Estado~
     6      6 Diego Padilha Rubert                      Doutorado em Ciência da Computação pela Universidade Federal de Mato Grosso d~ Brasil        2019 "Pro~ Brasil 
     7      7 Rodrigo Furtado dos Santos                Doutorado em Plant Molecular and Cellular Biology pela University of Florida   Estados Uni~  2020 "Cie~ Brasil 
     8      8 Nádia Maria Vieira Sampaio                Doutorado em Cell and Molecular Biology pela Colorado State University         Estados Uni~  2018 "Pes~ Brasil 
     9      9 Elisa Peripolli                           Doutorado em Genética e Melhoramento Animal pela Universidade Estadual Paulis~ Brasil        2021  NA   NA     
    10     10 Camila Ferreira Azevedo                   Doutorado em Estatística Aplicada e Biometria pela Universidade Federal de Vi~ Brasil        2015 "Mem~ Brasil 
    # ... with 5,339 more rows
  • Related