rvest每个节点刮取多个值

时间:2015-10-01 11:00:35

标签: xml r css-selectors rvest magrittr

以此示例XML

<body>
  <items>
    <item>
      <name>Peter</name>
    </item>
  </items>
  <items>
    <item>
      <name>Paul</name>
    </item>
    <item>
      <name>Claudia</name>
    </item>
  </items>
  <items/>
</body> 

问题:获得以下结果的最简单方法是什么?

"Peter"   "Paul"   ""

到目前为止我实现如下:

require(rvest)
require(magrittr)
my_xml <- xml("<items><item><name>Peter</name></item></items><items><item><name>Paul</name></item><item><name>Claudia</name></item></items><items></items>")
items <- my_xml %>% xml_nodes("items") %>% xml_node("item")
sapply(items, function(x){
  if(is.null(x)){
    ""
  } else {
    x %>% xml_node("name") %>% xml_text()
  }
})

对我来说,sapply构建接缝就像是在误导rvest或css-selectors。

1 个答案:

答案 0 :(得分:2)

实际上不需要

rvest,因为这是纯XML(最后你最终使用xml2构造):

library(xml2)

doc <- read_xml("<body>
  <items>
    <item>
      <name>Peter</name>
    </item>
  </items>
  <items>
    <item>
      <name>Paul</name>
    </item>
    <item>
      <name>Claudia</name>
    </item>
  </items>
  <items/>
</body>")


sapply(xml_find_all(doc, "//items"), function(x) {
  val <- xml_text(xml_find_all(x, "./item[1]/name"))
  ifelse(length(val)>0, val, "")
})

## [1] "Peter" "Paul"  ""     

(有时XPath可能比CSS好)