Home > OS >  rvest to scrape sub-title heading information and data below the subtitles
rvest to scrape sub-title heading information and data below the subtitles

Time:06-20

I am trying to scrape some information from the following:

url = "https://www.fotocasa.es/indice-precio-vivienda/barcelona-capital/dreta-de-l-eixample"
preciosComAlq = url %>% 
  read_html()

I can get the subtitle information using:

preciosComAlq %>% 
  html_elements(".t-panel-container") %>%
  html_elements(".t-panel.comprar") %>% 
  #html_nodes("h3")
  html_elements(".t-panel_subtitle")

Which gives:

{xml_nodeset (5)}
[1] <h3 >\r\n                                Precio m² por número de habitaciones\r\n                            </h3>
[2] <h3 >\r\n                                Valor medio de la vivienda por tamaño\r\n                            </h3>
[3] <h3 >Precio m² por características</h3>
[4] <h3 >Ofertas activas de comprar</h3>
[5] <h3 >Características más comunes</h3>

But I want to collect the information below each subtitle.

For example Precio m² por características I want the following:

6.345 €/m²
Precio con terraza
lift
6.654 €/m²
Con ascensor
amuebla
7.735 €/m²
Amueblado
parking
7.133 €/m²
Con parking

I can do something like:

bind_cols(
  preciosComAlq %>% 
    html_elements(".t-panel-container") %>%
    html_elements(".t-panel.comprar") %>% 
    html_elements(".description-wrap") %>% 
    html_elements(".description-item_inner-wr") %>%
    html_elements(".description-item_semibold") %>% 
    html_text() %>% 
    trimws(),
  
  preciosComAlq %>% 
    html_elements(".t-panel-container") %>%
    html_elements(".t-panel.comprar") %>% 
    html_elements(".description-wrap") %>% 
    html_elements(".description-item_inner-wr") %>%
    html_elements(".description-item_regular") %>% 
    html_text() %>% 
    trimws()
)

Which gives:

# A tibble: 12 × 2
   ...1       ...2                            
   <chr>      <chr>                           
 1 9.538 €/m² Precio de estudio o 1 habitación
 2 6.176 €/m² Precio de 3 habitaciones        
 3 7.273 €/m² Precio de 2 habitaciones        
 4 5.813 €/m² Precio de más de 3 habitaciones 
 5 6.345 €/m² Precio con terraza              
 6 6.654 €/m² Con ascensor                    
 7 7.735 €/m² Amueblado                       
 8 7.133 €/m² Con parking                     
 9 140m²      Metros cuadrados                
10 Piso       Tipo de inmueble                
11 3          Número de habitaciones          
12 5          Planta del inmueble

However, I don't know what section each item/row corresponds to.

From looking at the webpage I see that

9.538 €/m² Precio de estudio o 1 habitación

Correspond to Precio m² por número de habitaciones.

But I would also like to link:

 5 6.345 €/m² Precio con terraza              
 6 6.654 €/m² Con ascensor                    
 7 7.735 €/m² Amueblado                       
 8 7.133 €/m² Con parking

With its correct corresponding subtitle = Precio m² por características. So the expected output would be something like the following, a new column with the subtitle heading.

# A tibble: 12 × 2
   ...1       ...2                            
   <chr>      <chr>                           
 1 9.538 €/m² Precio de estudio o 1 habitación   Precio m² por número de habitaciones
 2 6.176 €/m² Precio de 3 habitaciones           Precio m² por número de habitaciones
 3 7.273 €/m² Precio de 2 habitaciones           Precio m² por número de habitaciones
 4 5.813 €/m² Precio de más de 3 habitaciones    Precio m² por número de habitaciones
 5 6.345 €/m² Precio con terraza                 Precio m² por características
 6 6.654 €/m² Con ascensor                       Precio m² por características
 7 7.735 €/m² Amueblado                          Precio m² por características
 8 7.133 €/m² Con parking                        Precio m² por características
 9 140m²      Metros cuadrados                   Características más comunes
10 Piso       Tipo de inmueble                   Características más comunes
11 3          Número de habitaciones             Características más comunes
12 5          Planta del inmueble                Características más comunes

CodePudding user response:

This web page does not have a hierarchical structure. It is just a list of headings and then the sub information.
In the solution below, I go through that list one-by-one processing the heading and then process the subtitles from the "div" nodes.
For each div node I create a dataframe with the subtitle information and the previously found heading.
See the comments for more detail.

library(rvest)
library(xml2)
library(stringr)

url = "https://www.fotocasa.es/indice-precio-vivienda/barcelona-capital/dreta-de-l-eixample"
preciosComAlq =   read_html(url)

#get all of the children nodes containing the desire information
subNodes<-preciosComAlq %>% 
   html_elements(".t-panel-container") %>%
   html_elements(".t-panel.comprar") %>% html_children()

#initialize storage
dfs<-list()
i<-1

for (node in subNodes){
   #get the node types (div or h2/3)
  NodeName <- node %>% xml_name()
   
  #if div node get the information
   if (NodeName =="div") {
      # value <- node %>% html_elements(".description-item_semibold") %>% 
      #        html_text() %>% trimws()
      # description <- node %>% html_elements(".description-item_regular") %>% 
      #         html_text() %>% trimws()
      
      subtext <-node %>% html_children() %>% html_text2() %>% trimws()

      #combine the header with the subheading information and store in list
      dfs[[i]] <- data.frame(subheading, subtext)
      i <- i 1
      
   } else {  #if a heading node get the header
      subheading <-node  %>% html_text2() %>% trimws()
 #     print(subheading)
   }
}

#combine all of the information into 1 df
answer <-bind_rows(dfs)
#remove extra lines
answer <- answer %>% filter(subtext != "")
#clean up the subtext column
answer$subtext <- answer$subtext %>% stringr::str_squish()

answer
                                         subheading                                     subtext
1  Precio de compra de pisos en Dreta de l'Eixample              6.535 €/m² Precio medio por m²
2  Precio de compra de pisos en Dreta de l'Eixample        809.970 € Valor medio de un inmueble
3              Precio m² por número de habitaciones 9.538 €/m² Precio de estudio o 1 habitación
4              Precio m² por número de habitaciones         6.176 €/m² Precio de 3 habitaciones
5              Precio m² por número de habitaciones         7.273 €/m² Precio de 2 habitaciones
6              Precio m² por número de habitaciones  5.813 €/m² Precio de más de 3 habitaciones
7             Valor medio de la vivienda por tamaño               508.138 € Precio por < 100 m²
8             Valor medio de la vivienda por tamaño               979.493 € Precio por > 100 m²
9                     Precio m² por características               6.345 €/m² Precio con terraza
10                    Precio m² por características                     6.654 €/m² Con ascensor
11                    Precio m² por características                        7.735 €/m² Amueblado
12                    Precio m² por características                      7.133 €/m² Con parking
13                       Ofertas activas de comprar                    1.014 inmuebles en venta
14                      Características más comunes                      140m² Metros cuadrados
15                      Características más comunes                       Piso Tipo de inmueble
16                      Características más comunes                    3 Número de habitaciones
17                      Características más comunes                       5 Planta del inmueble
18                      Características más comunes                  Comparte estos resultados:

With some additional modifications the subtext column can be divide into 2 columns if desired.

  • Related