【问题标题】:How to use rvest to scrape this table? Loop?如何使用 rvest 来刮这张表?环形?
【发布时间】:2021-04-09 18:55:48
【问题描述】:

我正在尝试从网站(名称)中“抓取”一些数据。我知道如何获取列表中的第一个名字——但我需要以同样的方式保存几千个名字。

这是我的代码:


library(rvest)
library(tidyverse)

url <- ("https://www.advokatsamfundet.se/Advokatsamfundet-engelska/Find-a-lawyer/Search-result/?firstname=&lastname=&companyname=&postalcity=&country=4401&spokenlanguage=&sortingcity=&positions=102001")


names <- url %>% 
  read_html() %>% 
    html_elements(xpath = '/html/body/div[3]/div/div/main/div[2]/div[2]/div[1]/a') %>% 
  html_text()

这给了我列表中的名字,就像它在表格中一样。

名称遵循以下简单结构:

'/html/body/div[3]/div/div/main/div[2]/div[2]/div[1]/a')
'/html/body/div[3]/div/div/main/div[2]/div[3]/div[1]/a')
'/html/body/div[3]/div/div/main/div[2]/div[4]/div[1]/a')

请注意,我们为每个名称增加 1。它在 6212 结束。

我开始研究一个函数,但我没有得到任何结果。 无论如何,它都在这里——但它不起作用,我认为这可能是一个死胡同。

scrape_fun <- function(.x){
  names %>% 
  html_elements(xpath = '/html/body/div[3]/div/div/main/div[2]/div[.x]/div[1]/a') %>% 
  html_text()
}

关于如何让它工作的任何建议?全部 6212 个名字?

【问题讨论】:

  • 您可以使用 for 循环。,。但是您可能会在 NHSdatadictionaRy 包中找到一个有用的功能,尽管它主要用于 而不是 Tags

标签: r web-scraping rvest


【解决方案1】:

您可以使用以下 css 模式来选择它们

library(magrittr)
library(rvest)

people <- read_html("https://www.advokatsamfundet.se/Advokatsamfundet-engelska/Find-a-lawyer/Search-result/?firstname=&lastname=&companyname=&postalcity=&country=4401&spokenlanguage=&sortingcity=&positions=102001") %>%
  html_nodes(".c-list .o-flex__item:nth-child(1) > [href]") %>%
  html_text()

这选择href 属性,在类o-flex__item 的第一个子元素(最左边的)中,这些元素与类c-list 共享父元素。 &gt; 是一个子组合子,指定右侧的内容是左侧的直接子代。与使用后代组合器(可以向下嵌套级别)相比,它是一种更有效和更具体的组合器。类 css 选择器是仅次于 id 的第二快方法。

另一种模式可能是html_nodes("[href*=personid]") - 这会选择包含字符串personid 的所有href 属性。

【讨论】:

  • 虽然看起来像一个表格,但它并不是一个真正的 html 表格。
  • 这就像一个魅力。我想会有更好的方法。你怎么知道选择什么?经验?我尝试了“选择器小工具”——但没有找到任何东西。
  • 经验。您可能想阅读this
【解决方案2】:

试试这个?

library(rvest)
library(tidyverse)

url <- ("https://www.advokatsamfundet.se/Advokatsamfundet-engelska/Find-a-lawyer/Search-result/?firstname=&lastname=&companyname=&postalcity=&country=4401&spokenlanguage=&sortingcity=&positions=102001")

names<- NULL
for (i in 1:6212){
names[i]<- url %>% 
  read_html() %>% 
    html_elements(xpath = paste0("'/html/body/div[3]/div/div/main/div[2]/div[",i,"]/div[1]/a'") )%>% 
  html_text()

}

【讨论】:

  • 看起来像我正在寻找的东西,但返回:错误:找不到对象'null'
  • 对不起 NULL 不为空。
  • 这只是给了我一个显示 NULL 的值和消息: xml_nodeset(nodes) 中的错误:VECTOR_ELT() 只能应用于“列表”,而不是“字符”
  • 我需要从我的手机转移到我可以输入的东西!...很快就会回来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多