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

时间:2017-07-18 14:57:17

标签: r rvest

有没有办法在html_attr()使用OR?在这个MRE中,我只希望节点有" drink"或"食物"属性。

也就是说,通过以下数据,我想做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的情况下这样做吗?

1 个答案:

答案 0 :(得分:2)

我打算建议使用xml2包,我认为这是rvest的依赖。

通过使用HTML

强制转移package::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"