【问题标题】:Follow up: How to download xml, when it somehow is html跟进:如何下载xml,当它以某种方式是html时
【发布时间】:2015-12-16 04:19:12
【问题描述】:

这是我一年前在这里提出的一个问题的后续:How can I extract info from xml page with R

建议的解决方案工作了很长一段时间。不幸的是,在它顺利运行后,我从未考虑过它。现在 R 向我抛出一个错误,我显然不知道如何继续。

这是我想做的:

require(XML)
require(RCurl)

url <- "http://ws.parlament.ch/votes/councillors?affairNumberFilter=20130051&format=xml"
affairs_det <- getURL(url, .opts=c(user_agent("Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"), 
                            verbose()), asNames=TRUE)  
#This worked, but not anymore
Error in function (type, msg, asError = TRUE)  : No URL set!
In addition: Warning message:
In mapCurlOptNames(names(.els), asNames = TRUE) :
Unrecognized CURL options: output, auth_token, options, fields, headers, method, url

affairs_det_parsed <- xmlTreeParse(substr(affairs_det,4,nchar(affairs_det)), encoding = "UTF-8")

这个问题是双重的。首先,我应该如何下载似乎是 xml 的文件,但如果我用download.file(url, destfile="test.xml") 下载它似乎是 html?我相信user_agent 的设置处理了...?

第二,我不明白错误?

编辑

我想通过标签访问信息,例如id。在 mysterios 错误之前,这也有效。

infofile <- xmlRoot(affairs_det_parsed)

#gets councillor ids
id <- getNodeSet(infofile, paste0("//councillors/councillor/id"))
id <- lapply(id, function(x) xmlSApply(x, xmlValue))
id <- sapply(id, "[[", 1)

谢谢!

【问题讨论】:

  • 以下对我有用。 affairs_det &lt;- getURL(url, asNames=TRUE);,尽管会引发您提到的警告。事实上,即使download.file(url,"test.xml") 也能正常工作。并且下载的xml 被解析得很好。不确定相同的解析 xml 是否符合您的目的。
  • @Frash 这确实会下载内容,但不幸的是没有标签。
  • "似乎是 XML.." 它不是。 ws.parlament.ch/votes/… 生成 XML 而不是 HTML。将其加载到浏览器中,然后查看页面源代码。
  • 但是在 R 中,它是 HTML。即使您的请求是明确格式=XML。奇怪的。如果你能把它作为 XML 导入 R,你会更好。有时 HTML 可能难以解析。我通过validator.w3.org/… 运行该页面并收到警告。

标签: xml r rcurl


【解决方案1】:

原始答案混合了 RCurl 和 httr 语法,这很奇怪。您上面的 sn-p 忽略指示使用 httr。可能 httr 已更改但继续与自身一起使用,但没想到会与 RCurl 一起使用。

library(httr)
x = GET(url)

检索文件。

stop_for_status(x)

检查没有错误。

xml = content(x)

获取 XML 内容。或者,下载到磁盘并使用 XML 来解析它

t <- tempfile()
GET(url, write_disk(t))
xml = xmlParse(t)

【讨论】:

  • 我还建议切换到不会泄漏内存并且可以直接从 httr 连接加载的 xml2 包。
【解决方案2】:

好吧,我几乎将真正的 XML 转换为 R 而不是 HTML。我认为这会有所帮助。

使用 XML 而非 HTML 解析会更可靠(同时请记住,您的源是提供带有错误的 HTML)XML 文件很简单,因此编写 xpath 会容易得多。

我第一次使用命令行 curl,是因为我比较熟悉它。这个命令行引入了 XML:

curl -H“接受:应用程序/xml”\ -H“内容类型:应用程序/xml”\ -X GET http://ws.parlament.ch/votes/councilors?affairNumberFilter=20130051&format=xml

我把它翻译成这个测试 URI 存在的 Rcurl,然后将它加载到 doc 中:

if(url.exists("http://ws.parlament.ch/votes/councillors?affairNumberFilter=20130051&format=xml")) { curl = getCurlHandle() curlSetOpt(.opts = list(httpheader = c(Accept="application/xml", "Content-Type"="application/xml"), verbose = TRUE),curl = curl) doc = getURL("http://ws.parlament.ch/votes/councillors?affairNumberFilter=20130051&format=xml", curl = curl) }

但是xmlParse 抛出一个错误说Error: XML content does not seem to be XML。对下载文件的目视检查会发现主要的垃圾字符,特别是 "。我认为这需要在进一步处理之前解决。

这很有趣,因为命令行 Curl 没有那些杂散的前导字符。

也许有更多经验的人可以更进一步。

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 2015-12-07
    • 2013-06-09
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多