You need to enable JavaScript to run this app. 如何使用rvest循环爬取目标列表中的全部6212个律师姓名?
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 12:36:05