如何使用rvest循环爬取目标列表中的全部6212个律师姓名?
R语言批量抓取同结构节点解决方案
现有代码的核心错误
- 你之前将
names变量赋值为单个节点的文本字符串,而非全页HTML对象,后续函数直接调用该变量自然无法解析。 - XPath字符串中的
.x不会被R自动识别为变量,需手动拼接动态路径,且无需逐个生成XPath,用通配符可一次性抓取全部节点。
最优实现(单次加载页面抓取全量数据)
library(rvest) library(tidyverse) # 仅加载一次全页HTML文档 page_html <- "https://www.advokatsamfundet.se/Advokatsamfundet-engelska/Find-a-lawyer/Search-result/?firstname=&lastname=&companyname=&postalcity=&country=4401&spokenlanguage=&sortingcity=&positions=102001" %>% read_html() # 用XPath位置函数直接匹配全部同结构节点 lawyer_names <- page_html %>% html_elements(xpath = '/html/body/div[3]/div/div/main/div[2]/div[position() >= 2 and position() <= 6212]/div[1]/a') %>% html_text(trim = TRUE)
- 代码原理:XPath内置
position()函数可直接匹配2到6212序号的所有同层级div节点,无需手动拼接路径,仅请求1次页面即可拿到全量姓名,效率远高于循环请求。 - 若需过滤空值,可在最后加
na.omit(lawyer_names)清理无效节点。
兜底方案(通配符失效时使用)
若页面结构变更导致通配符定位失效,可手动拼接XPath循环抓取:
# 预加载全页HTML对象 page_html <- "https://www.advokatsamfundet.se/Advokatsamfundet-engelska/Find-a-lawyer/Search-result/?firstname=&lastname=&companyname=&postalcity=&country=4401&spokenlanguage=&sortingcity=&positions=102001" %>% read_html() # 生成需抓取的div序号范围 div_seq <- 2:6212 # 定义爬取函数,传入HTML文档对象作为参数 scrape_div <- function(div_idx, doc) { # 拼接动态XPath current_path <- paste0('/html/body/div[3]/div/div/main/div[2]/div[', div_idx, ']/div[1]/a') doc %>% html_elements(xpath = current_path) %>% html_text(trim = TRUE) } # 批量运行函数,返回字符向量 lawyer_names <- purrr::map_chr(div_seq, scrape_div, doc = page_html)
注意:若返回的姓名数量远少于6212,说明目标网站存在分页机制,当前静态URL仅返回第一页内容,需先调整分页参数规则后再批量爬取。
内容的提问来源于stack exchange,提问作者Tomas R
相关产品推荐
相关产品推荐

