rvest中read_html_live()无法配合html_elements()提取元素的问题
问题分析与解决
核心原因
read_html_live()返回的是LiveHTML类型的R6对象,它对应动态渲染的浏览器页面,和read_html()返回的静态xml_document对象结构完全不同。常规的html_elements()函数仅能处理静态HTML/XML文档,无法直接作用于LiveHTML对象,这就是你得到空节点集的原因。
解决方案
方法1:提取静态HTML后处理
先通过LiveHTML对象的html()方法获取渲染完成的静态HTML代码,再转成可处理的文档对象,之后就能正常使用html_elements():
library(rvest) y <- read_html_live("https://www.ngaarawhetu.org/news/") # 提取动态渲染后的HTML并转为静态文档 y_static <- read_html(y$html()) y_ele <- html_elements(y_static, xpath = "//link[@rel = 'alternate']") print(y_ele)
方法2:直接使用LiveHTML的查询方法
LiveHTML对象自带find_elements()方法,支持XPath或CSS选择器,用法和html_elements()类似:
library(rvest) y <- read_html_live("https://www.ngaarawhetu.org/news/") # 用LiveHTML自带的find_elements方法查询 y_ele <- y$find_elements(xpath = "//link[@rel = 'alternate']") # 若需要提取元素属性,可进一步用get_attribute()方法 sapply(y_ele, function(el) el$get_attribute("href"))
两种方法都能得到和read_html()一致的结果:如果后续要做大量静态HTML解析,选方法1;如果需要和动态页面交互(比如点击、滚动),选方法2。
内容的提问来源于stack exchange,提问作者Brett
相关产品推荐
相关产品推荐

