【问题标题】:How can I conditionally select attributes from html nodes with rvest?如何有条件地从带有 rvest 的 html 节点中选择属性?
【发布时间】:2017-07-18 14:57:16
【问题描述】:

有没有办法将 OR 与 html_attr() 一起使用?在这个 MRE 中,我只想要具有“drink”或“food”属性的节点。

也就是说,有了以下数据,我想做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 的情况下执行此操作吗?

【问题讨论】:

  • 最终它会像...%in% c("drink", "food") 一样,但要启用测试,您应该使您的示例可重现,...
  • 如何使 xml 数据可重现?
  • 你可以使用dput()分享mydata
  • 这只是链接回这篇文章。

标签: r rvest


【解决方案1】:

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

通过使用package::htmltools 强制转换为HTML 来实现可重复性

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"

【讨论】:

  • 不确定您的意思,但您应该在 Google 上搜索 xpath selectors 以了解可以做什么。
猜你喜欢
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多