rvest 抓取每个节点的多个值
rvest scrape multiple values per node
以这个为例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 选择器。
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 更好)
以这个为例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 选择器。
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 更好)