2017-07-18 32 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選擇器'得到什麼都可以做的好主意。 –

相關問題