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

如何用R的rvest包提取多种HTML元素并保留原有顺序?

解决rvest提取多类型HTML元素并保留顺序的问题

你遇到的这个问题其实很常见——用rvest单独提取某类元素很顺手,但要同时抓多种元素还保持原网页里的顺序就卡壳了对吧?先看你的测试场景:

测试用例

你给出的测试HTML代码:

dummy_html <- "<p>hi there</p> <p>2nd para</p> <div>unwanted stuff</div> <span>something new</span> <p>3rd para</p> <span>extra stuff</span> <div>more unwanted stuff</div> <p>4th para</p>"

你已经能单独提取<p>和<span>元素:

单独提取p元素

library(rvest)
dummy_html %>% read_html %>% html_nodes("p")
# 输出:
# {xml_nodeset (4)}
# [1] <p>hi there</p>
# [2] <p>2nd para</p>
# [3] <p>3rd para</p>
# [4] <p>4th para</p>

单独提取span元素

dummy_html %>% read_html %>% html_nodes("span")
# 输出:
# {xml_nodeset (2)}
# [1] <span>something new</span>
# [2] <span>extra stuff</span>

但你想要的是按网页原有顺序同时提取这两类元素,得到这样的结果:

{xml_nodeset (6)}
[1] <p>hi there</p>
[2] <p>2nd para</p>
[3] <span>something new</span>
[4] <p>3rd para</p>
[5] <span>extra stuff</span>
[6] <p>4th para</p>

你尝试过的方法

你试了dummy_html %>% read_html %>% html_nodes("span|p")但报错了,这是因为rvest的html_nodes()支持CSS选择器,但CSS里的多元素选择器是用逗号分隔,而不是竖线!

正确解决方案

只需要把选择器改成逗号分隔的形式就可以了,这是CSS选择器里同时选中多个元素的标准写法:

library(rvest)
dummy_html %>% read_html %>% html_nodes("p, span")

运行这段代码就能得到你想要的、按原有顺序排列的<p>和<span>元素集合了。

原理很简单:CSS选择器中element1, element2表示“选中所有element1和element2元素”,rvest会按照这些元素在DOM中的出现顺序返回结果,完美匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:50:55