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
相关产品推荐
相关产品推荐

