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

