如何使用 R 从 xml 页面中提取信息

Posted

技术标签:

【中文标题】如何使用 R 从 xml 页面中提取信息【英文标题】:How can I extract info from xml page with R 【发布时间】:2014-05-08 04:26:49 【问题描述】:

我正在尝试从此页面获取所有信息:http://ws.parlament.ch/affairs/19110758/?format=xml

首先我将文件下载到file,然后用xmlParse(file)解析它。

download.file(url = paste0(http://ws.parlament.ch/affairs/19110758/?format=xml), destfile = destfile)
file <- xmlParse(destfile[])

我现在想提取我需要的所有信息。例如标题和 ID 号。我尝试过这样的事情:

title <- xpathSApply(file, "//h2", xmlValue)

但这只会给我一个错误:unable to find an inherited method for function ‘saveXML’ for signature ‘"XMLDocument"

接下来我尝试的是:

library(plyr)

test <-ldply(xmlToList(file), function(x)  data.frame(x[!names(x)=="id"])  )

这给了我一个data.frame和一些信息。但是我丢失了诸如id 之类的信息(这是最重要的)。

我想得到一个data.frame,其中一行(每个事件只有一行)包含一个事件的所有信息,例如id``updatedadditionalIndexing``affairType等。

有了这个,它就可以工作了(id 的例子):

infofile <- xmlRoot(file)

nodes <-  getNodeSet(file, "//affair/id")
id <-as.numeric(lapply(nodes, function(x) xmlSApply(x, xmlValue)))

【问题讨论】:

【参考方案1】:

它是一个 html 文件,而不是一个 XML 文件。你需要使用htmlParse:

destfile <- tempfile() # make this example copy-pasteable
download.file(url = "http://ws.parlament.ch/affairs/19110758/?format=xml", destfile = destfile)
file <- htmlParse(destfile)
title <- xpathSApply(file, '//h2')
xmlValue(title[[1]])
# [1] "Heilmittelwesen. Gesetzgebung"

【讨论】:

但是如果我 htmlParse 文档,很多信息都会丢失。请参阅:ws.parlament.ch/affairs/19110758/?format=xml 我需要提取大部分信息......因此我需要 xmlParse 文档。还是我弄错了? 你是对的,似乎使用 R 的 download.file 函数强制服务器向你发送 HTML 而不是 XML,可能是由于 HTTP 标头的原因。尝试手动下载文件并使用xmlParse 我无法手动为 30000 个文档执行此操作 :-) 我在提取时做错了什么? test &lt;- xpathSApply(file, "//h2", xmlValue) 因此给了我一个空向量。 不,看readLines(destfile),分明是HTML文件。问题出在请求上。尝试使用batch downloader,我相信他们的服务器不会为您提供 XML,除非您足够好地模仿浏览器(我不确定确切的标题)。 ok... 用chrome我可以看到xml文件,用firefox,这在某种程度上是不可能的。我会深入研究这件事,但正如你可能已经注意到的那样,我很新,所以如果有人知道我如何强制 R 正确下载,我将不胜感激。【参考方案2】:

这将带您进入您的 XML:

library(XML)
library(RCurl)
library(httr)

srcXML <- getURL("http://ws.parlament.ch/affairs/19110758/?format=xml", 
            .opts=c(user_agent("Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"),
              verbose()))

myXMLFile <- xmlTreeParse(substr(srcXML,4,nchar(srcXML)))

我会只使用来自httrGET(),但它似乎并没有很好地传递user-agent(当我不在代理后面时,我需要测试它以确定具体是什么错误是)。我也做了substr(),因为前面有一堆奇怪的字符导致xmlTreeParse() 调用出错。

【讨论】:

谢谢。这适用于我的屏幕。但是如何下载保留所有信息的文件 html 会松动? writeLines(substr(srcXML,4,nchar(srcXML)), "filenametowriteto.xml") 应该可以工作 完美。我现在完成了任务的第一部分(我显然无法掌握)。现在,数据提取仍然不起作用:id &lt;- xpathSApply(myXMLFile, "//name[1]", xmlValue)给我:Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘saveXML’ for signature ‘"XMLDocument"’ 您能否详细说明(在您上面的原始 q 中)您想提取哪些信息?对我或其他人来说,提供一种更优化的方式从 XML 文档中获取所需内容可能并不难。

以上是关于如何使用 R 从 xml 页面中提取信息的主要内容,如果未能解决你的问题,请参考以下文章

如何解析 HTML 或将 HTML 转换为 XML,以便我从网站中提取信息(在 C# 中)[重复]

如何使用坐标和 R 中 shapefile 中的另一个值从栅格中提取值?

如何从 Spark-Structured-Streaming 中的嵌套 XML_String 中提取信息

如何使用目标 c 从 xml 信封中提取 xml 肥皂体?

如何使用条形码从 api 中提取信息并将其解析到用户详细信息小部件屏幕 - 在颤振中

如何使用 Postman 从 XML 中提取变量?