如何使用 rvest 来抓取这个 table?环形?
How to use rvest to scrape this table? Loop?
我正在尝试 'scrape' 来自网站(名称)的一些数据。我知道如何获得列表中的第一个名字 -- 但我需要以相同的方式保存几千个名字。
这是我的代码:
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()
这给了我列表中的第一个名字,因为它在 table。
名称遵循以下简单结构:
'/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 个名字?
试试这个?
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()
}
您可以使用以下 css 模式来 select 他们
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()
此 selects 用于 href
属性,在第一个子元素(最左边的 列 中,class o-flex__item
,它们与 class c-list
有一个共享父级。 >
是一个子组合子,指定右边的是左边的直接子元素。与使用后代组合器(可以向下嵌套级别)相比,它是一种更有效和更具体的组合器。 Class css selector 是仅次于 id 的第二快方法。
另一个模式可能是 html_nodes("[href*=personid]")
- 这个 selects 用于包含字符串 personid
.
的所有 href
属性
我正在尝试 'scrape' 来自网站(名称)的一些数据。我知道如何获得列表中的第一个名字 -- 但我需要以相同的方式保存几千个名字。
这是我的代码:
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()
这给了我列表中的第一个名字,因为它在 table。
名称遵循以下简单结构:
'/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 个名字?
试试这个?
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()
}
您可以使用以下 css 模式来 select 他们
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()
此 selects 用于 href
属性,在第一个子元素(最左边的 列 中,class o-flex__item
,它们与 class c-list
有一个共享父级。 >
是一个子组合子,指定右边的是左边的直接子元素。与使用后代组合器(可以向下嵌套级别)相比,它是一种更有效和更具体的组合器。 Class css selector 是仅次于 id 的第二快方法。
另一个模式可能是 html_nodes("[href*=personid]")
- 这个 selects 用于包含字符串 personid
.
href
属性