2017-07-18 41 views
0

有没有办法使用OR与html_attr()?在这个MRE中,我只想要具有“饮料”或“食物”属性的节点。如何从rvest节点中有条件地选择属性?

也就是说,用下面的数据,我想这样做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"/> 

我能做到这一点,而不拉出饮料和食品分开属性,结合载体,并删除NAs?

+0

将STHG像'...%的%C( “喝”, “食品”)',而是让测试它,你应该让你的例子可重现,... – BigDataScientist

+0

如何使xml数据可重现? – jtr13

+0

你可以用'dput()'来分享'mydata'。 – BigDataScientist

回答

1

我打算建议使用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" 
+0

太好了,谢谢。 @特定于xml2的使用? – jtr13

+1

不确定你的意思,但你应该谷歌'xpath选择器'得到什么都可以做的好主意。 –

相关问题