rvest::html_elements嵌套调用不遵循节点集限制是否为预期行为?
这是XPath语法的标准行为,并非rvest的漏洞。
XPath中以//开头的表达式属于绝对路径查询,无论你在哪个节点集上执行查询,都会默认从整个HTML文档的根节点开始匹配元素,所以你从筛选出的div节点集上查询//p时,依然会返回整个文档内所有的p元素,才会出现超出预期的结果。
如果要限定仅在当前节点集的范围内检索后代元素,需要使用相对路径,在//前加.指代当前节点上下文即可,修改后的代码如下:
html %>% html_elements(xpath="//div") %>% html_elements(xpath = ".//p") %>% html_text() # 运行输出:[1] "This is a nested paragraph"
补充几个常用的XPath相对路径规则,方便后续使用:
- 直接写标签名,如
xpath = "p":仅匹配当前节点的直接子级p元素 xpath = ".//p":匹配当前节点所有后代层级(子、孙、更深层级)的p元素xpath = "./p":效果等价于直接写p,仅匹配直接子级p元素
内容的提问来源于stack exchange,提问作者Chris Paciorek
相关产品推荐
相关产品推荐

