You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SelectorGadget生成的CSS/XPath在rvest中无效,无法提取TXT下载链接

分析你的空节点集问题 & 解决方案

我之前也碰过类似的政府网站爬取坑,大概率是这几个原因导致你拿到{xml_nodeset (0)}:

1. 页面内容是动态加载的,rvest抓不到JS渲染后的元素

SelectorGadget是基于浏览器开发者工具里已经渲染好的DOM来选元素,但rvest的read_html()只会抓取服务器返回的原始静态HTML。如果这个页面的议会记录列表是通过JavaScript动态加载的(比如滚动加载、延迟加载),那原始HTML里根本没有你要的txt链接,自然抓不到空结果。

你可以快速验证:打开页面后右键选择「查看页面源代码」(不是「检查」),在源代码里搜索.txt,如果搜不到任何结果,那肯定是动态加载的问题。

2. SelectorGadget生成的选择器不准确

有时候SelectorGadget会选到带有动态生成类名/ID的元素(比如带随机字符串的类),这些选择器在下次请求页面时可能失效;或者它选了父容器,但实际的下载链接在更深的子节点里,导致匹配不到。


针对性解决方案

方案一:如果是静态内容(源代码里能搜到.txt)

直接用属性选择器精准匹配所有带.txt的链接,比SelectorGadget生成的选择器更靠谱:

library(rvest)
library(urltools)

# 目标页面URL
base_url <- "https://www.bundestag.de/dokumente/protokolle/plenarprotokolle/plenarprotokolle"

# 读取页面
page <- read_html(base_url)

# 直接筛选所有href以.txt结尾的a标签
txt_nodes <- page %>% html_elements("a[href$='.txt']")

# 提取链接并转成绝对路径
txt_links <- txt_nodes %>% 
  html_attr("href") %>% 
  url_absolute(base_url)

# 查看结果
head(txt_links)

方案二:如果是动态内容(源代码里搜不到.txt)

这时候需要用能模拟浏览器渲染的工具,比如playwright(比RSelenium更轻量):

library(playwright)

# 第一次用需要安装依赖
pw <- install_playwright()

# 启动无头浏览器(不弹出窗口)
browser <- pw$chromium$launch(headless = TRUE)
page <- browser$new_page()

# 访问页面,等待网络空闲确保内容加载完成
page$goto(base_url, wait_until = "networkidle")

# 模拟滚动到底部加载更多内容(如果页面需要)
page$evaluate("window.scrollTo(0, document.body.scrollHeight)")
Sys.sleep(2) # 给2秒加载时间,可根据实际调整

# 抓取所有txt链接
txt_locator <- page$locator("a[href$='.txt']")
txt_links <- sapply(txt_locator$all(), function(node) node$get_attribute("href"))

# 关闭浏览器
browser$close()

# 查看结果
head(txt_links)

额外提示

  • 德国联邦议院的网站有反爬机制,不要频繁请求,建议在循环里加Sys.sleep(1)控制请求频率。
  • 用SelectorGadget时,优先选语义化的稳定选择器:比如带download-txt这类明确类名的元素,或者直接用属性匹配(像上面的[href$='.txt']),避免依赖动态生成的ID/类。

内容的提问来源于stack exchange,提问作者der_grund

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:17:25