我是一名XML新手,试图抓取并解析以下RSS提要http://xml.newsbox.ch/corporate_web/che/dufry/digest_en_year_2015_atom.xml。在此基础上,我遇到了两个问题:
1)我想在解析的文档上使用xmlChildren
提取单个新闻报道的节点,如下所示:
library(RCurl)
library(XML)
xml.url <- "http://xml.newsbox.ch/corporate_web/che/dufry/digest_en_year_2015_atom.xml"
script <- getURL(xml.url)
doc <- xmlParse(script)
doc.children = xpathApply(doc,"//entry",xmlChildren)
虽然此过程适用于其他各个Feed,其中各个新闻版本与节点<items>
一起存储,但在节点<entry>
的特定情况下它不起作用,因为它返回一个空列表。我被困在这里,因为我无法弄清楚我在XML文档的结构中错过了什么。
2)更一般地说:当XML结构包含节点<item>
或节点<entry>
中的各个新闻报道而不事先知道特定结构时,我是否可以实现此方法来处理这两种情况?
非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
您需要使用命名空间。以下是XML
和xml2
选项:
# XML
ns <- xmlNamespaceDefinitions(doc, simplify=TRUE)
names(ns)[1] <- "x"
nodes <- getNodeSet(doc, "//x:entry", namespaces=ns)
# xml2
library(xml2)
XML_URL <- "http://xml.newsbox.ch/corporate_web/che/dufry/digest_en_year_2015_atom.xml"
doc <- read_xml(XML_URL)
ns <- xml_ns_rename(xml_ns(doc), d1="x")
xml_find_all(doc, "//x:entry", ns=ns)
使用boolean() XPath operator查看能够处理多种情况(即不同的Feed格式)。
答案 1 :(得分:1)
这可能无法完全回答您的问题,但您是否考虑使用像tm.plugin.webmining这样的现成软件包?
如果您不想使用该软件包,您仍然可以检查代码并查看它们如何解析数据。