I am trying to collect some links from a website in R. I want to collect just the following box of links in the footer.
Viviendas en venta en Artigues - Llefià
Viviendas en venta en Salut - Lloreda
Viviendas en venta en Gorg - Progrés
Viviendas en venta en Bonavista - Bufalà - Morera
Viviendas en venta en Montigalà - Sant Crist
Viviendas en venta en Centre Badalona
Viviendas en venta en Port
Viviendas en venta en Canyet - Pomar
Viviendas en venta en Casagemes - Canyadó
I can run the following:
library(rvest)
webpage = "https://www.fotocasa.es/es/comprar/viviendas/badalona/todas-las-zonas/l" %>%
read_html()
webpage %>%
html_nodes(".re-SharedSeoFooter-layout.re-SharedSeoFooter-layout--column") %>%
html_nodes(".re-SharedSeoFooter-nav")
But I only want the items for "Viviendas en Badalona" and not the others. Preferably I would like to filter the 3 columns in the footer to something like contains("Viviendas en")
Running:
webpage %>%
html_nodes(".re-SharedSeoFooter-layout.re-SharedSeoFooter-layout--column") %>%
html_nodes(".re-SharedSeoFooter-nav") %>%
#html_nodes(".sui-MoleculeCollapsible") %>%
html_nodes(".sui-ListLink") %>%
html_nodes(".sui-ListLink-item") %>%
html_nodes(".sui-LinkBasic")
Gives me all items but I cannot differentiate between the 3 columns in the footer:
Encuentra más inmuebles en Badalona
, Viviendas cerca de Badalona
and Viviendas en Badalona
.
Any help on how I can split the 3 types of data up would be great. If I can scrape it like the following:
contains("Encuentra más inmuebles en")
contains("Viviendas cerca de")
contains("Viviendas en")
(Since the place name will change but not the base text).
CodePudding user response:
Is this what you wanted? These are the links for the stuff you listed
library(rvest)
library(tidyverse)
tibble(
locations = "https://www.fotocasa.es/es/comprar/viviendas/badalona/todas-las-zonas/l" %>%
read_html() %>%
html_elements(".re-SharedSeoFooter-layout--column~ .re-SharedSeoFooter-layout--column .re-SharedSeoFooter-layout--column .sui-LinkBasic") %>%
html_text2(),
links = "https://www.fotocasa.es/es/comprar/viviendas/badalona/todas-las-zonas/l" %>%
read_html() %>%
html_elements(".re-SharedSeoFooter-layout--column~ .re-SharedSeoFooter-layout--column .re-SharedSeoFooter-layout--column .sui-LinkBasic") %>%
html_attr("href") %>%
paste0("https://www.fotocasa.es/", .)
)
# A tibble: 9 x 2
locations links
<chr> <chr>
1 Viviendas en venta en Artigues - Llefià https://www.fotocasa.es//es/c~
2 Viviendas en venta en Salut - Lloreda https://www.fotocasa.es//es/c~
3 Viviendas en venta en Gorg - Progrés https://www.fotocasa.es//es/c~
4 Viviendas en venta en Bonavista - Bufalà - Morera https://www.fotocasa.es//es/c~
5 Viviendas en venta en Montigalà - Sant Crist https://www.fotocasa.es//es/c~
6 Viviendas en venta en Centre Badalona https://www.fotocasa.es//es/c~
7 Viviendas en venta en Port https://www.fotocasa.es//es/c~
8 Viviendas en venta en Canyet - Pomar https://www.fotocasa.es//es/c~
9 Viviendas en venta en Casagemes - Canyadó https://www.fotocasa.es//es/c~
CodePudding user response:
To answer your question as posed, you can use :contains to target the h2 tag text but will need to move up to the parent section, hence using xpath, then down to the child anchor tags to extract the urls of interest:
library(rvest)
library(magrittr)
url <- "https://www.fotocasa.es/es/comprar/viviendas/badalona/todas-las-zonas/l"
links <- url %>%
read_html() %>%
html_elements(xpath = '//h2[contains(., "Viviendas en ")]/parent::section//a') %>%
html_attr('href') %>%
url_absolute(url)