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.