我正在使用 XML2
从在线 XML 文档中提取发布数据,例如 this一,使用此代码:
xF <- read_xml(target, encoding = "UTF-8") ## target = above link
获取每个发布节点存在的项目没有问题。
Titles <- xml_text(xml_find_all(xF, "//publication-base_uk:title", xml_ns(xF)))
Pub.Lang <- xml_text(xml_find_all(xF, "//publication-base_uk:language/core:term/core:localizedString", xml_ns(xF)))
## etc...
但是,我对如何获取并不总是有条目的项目感到困惑,例如同行评审标签。
Peer.Rev <- xml_text(xml_find_all(xF, "//extensions-core:peerReviewed", xml_ns(xF)))
为所有具有 peerReviewed 子标签的出版物返回一个值,但由于某些 peerReviewed 标签没有子标签,因此计数已关闭。有没有办法用 NA(或其他任何东西)代替缺失的文本值?
提前致谢。
最佳答案
使用 xml2::xml_find_first()
应该可以得到你想要的。
示例:
假设我们想要来自此 xml rss 提要的博客文章类别: https://eagereyes.org/feed .其中一些帖子只有一个类别,有些则不止一个。搜索一个就可以了:
feed <- "https://eagereyes.org/feed"
doc <- httr::GET(feed) %>% xml2::read_xml()
channel <- xml2::xml_find_all(doc, "channel")
site <- xml2::xml_find_all(channel, "item")
categories <- tibble::tibble(
category1 = xml2::xml_text(xml2::xml_find_all(site, "category[1]"))
)
> categories
# A tibble: 10 x 1
category1
<chr>
1 Papers
2 Blog 2017
3 Links
4 Blog 2017
5 Blog 2017
6 Talk
7 ISOTYPE Books
8 Techniques
9 Basics
10 Blog 2017
但是多次尝试这样做不会:
categories <- tibble::tibble(
category1 = xml2::xml_text(xml2::xml_find_all(site, "category[1]")),
category2 = xml2::xml_text(xml2::xml_find_all(site, "category[2]"))
)
Error: Column `category2` must be length 1 or 10, not 3
xml_find_first
拯救:
categories <- tibble::tibble(
category1 = xml2::xml_text(xml2::xml_find_first(site, "category[1]")),
category2 = xml2::xml_text(xml2::xml_find_first(site, "category[2]"))
)
> categories
# A tibble: 10 x 2
category1 category2
<chr> <chr>
1 Papers paper
2 Blog 2017 conference
3 Links <NA>
4 Blog 2017 <NA>
5 Blog 2017 <NA>
6 Talk <NA>
7 ISOTYPE Books isotype
8 Techniques <NA>
9 Basics <NA>
10 Blog 2017 <NA>
希望对您有所帮助。
关于xml - R & XML2 : Replace missing XML elements with NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33933030/