r语言 - 如何使用 rvest 有条件地从 html 节点中选择属性?



有没有办法将OR与html_attr()一起使用?在此 MRE 中,我只需要具有"饮料"或"食物"属性的节点。

也就是说,有了以下数据,我想做一些类似mydata %>% html_nodes("mynode") %>% html_attr("drink" or "food" otherwise skip)的事情,然后得到:

[1] "tea"    "coffee" "egg"    "toast" 
> mydata
{xml_document}
<allitems>
[1] <mynode drink="tea"/>
[2] <mynode dessert="cookie"/>
[3] <mynode drink="coffee"/>
[4] <mynode spice="pepper"/>
[5] <mynode food="egg"/>
[6] <mynode food="toast"/>

我可以在不分别提取饮料和食物属性、组合载体和去除 NA 的情况下做到这一点吗?

我建议使用xml2包,我相信这是rvest依赖项。

通过强制HTMLpackage::htmltools使可复制

a <- htmltools::HTML(
'<mynode drink="tea"/>
<mynode dessert="cookie"/>
<mynode drink="coffee"/>
<mynode spice="pepper"/>
<mynode food="egg"/>
<mynode food="toast"/>')

现在使用xpath选择器,我们可以 提取具有属性或fooddrink的所有节点 .

> read_html(a) %>% xml_find_all('//*[@food or @drink]')
{xml_nodeset (4)}
[1] <mynode drink="tea"></mynode>
[2] <mynode drink="coffee"></mynode>
[3] <mynode food="egg"></mynode>
[4] <mynode food="toast"></mynode>

要获取属性值,请执行以下操作:

> read_html(a) %>% xml_find_all('//*[@food or @drink]') %>% 
xml_attrs() %>% unlist(use.names = FALSE)
[1] "tea"    "coffee" "egg"    "toast"

最新更新