Home > Back-end >  Filter rvest HTML tags by "contains" title in R
Filter rvest HTML tags by "contains" title in R

Time:06-10

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)
  • Related