xmlInternalTreeParse给出了#34;无法加载HTTP资源"但URL在浏览器中加载

时间:2016-09-04 04:01:43

标签: r xml xml-parsing

给出两个网址:

iris <- "http://service.iris.edu/fdsnws/event/1/query?starttime=2010-04-04&endtime=2010-04-05"
caltech <- "http://service.scedc.caltech.edu/fdsnws/event/1/query?starttime=2010-04-04&endtime=2010-04-05"

正在运行

doc <- xmlInternalTreeParse(iris)

有效,但

doc <- xmlInternalTreeParse(caltech)

返回

Error: 1: failed to load HTTP resource

尽管我的浏览器都能正常工作。此外,使用httr包检查状态会给出&#34; 200&#34;,e。 G:

> GET(caltech)$status_code
[1] 200
> 

这里发生了什么?这导致我的CRF上的rFDSN包出现问题,所以我非常感谢一些指导!

1 个答案:

答案 0 :(得分:1)

我可以非常一致地完成以下工作:

library(httr)
library(xml2)
library(XML)

UA <- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36"
res <- GET("http://service.scedc.caltech.edu/fdsnws/event/1/query",
           query=list(starttime="2010-04-04", endtime="2010-04-05"),
           user_agent(UA), verbose())

x_doc <- read_xml(content(res, as="text", encoding="UTF-8"))
ns <- xml_ns_rename(xml_ns(x_doc), d1="def")
xml_find_all(x_doc, ".//def:event", ns)
## {xml_nodeset (118)}
##  [1] <event publicID="quakeml:service.scedc.caltech.edu/fdsnws/even ...
##  [2] <event publicID="quakeml:service.scedc.caltech.edu/fdsnws/even ...
##  [3] <event publicID="quakeml:service.scedc.caltech.edu/fdsnws/even ...
##  [4] <event publicID="quakeml:service.scedc.caltech.edu/fdsnws/even ...
##  [5] <event publicID="quakeml:service.scedc.caltech.edu/fdsnws/even ...
##  [6] <event publicID="quakeml:service.scedc.caltech.edu/fdsnws/even ...
##  [7] <event publicID="quakeml:service.scedc.caltech.edu/fdsnws/even ...
##  [8] <event publicID="quakeml:service.scedc.caltech.edu/fdsnws/even ...
##  [9] <event publicID="quakeml:service.scedc.caltech.edu/fdsnws/even ...
## [10] <event publicID="quakeml:service.scedc.caltech.edu/fdsnws/even ...
## ...

您可以删除生产中的verbose()。奇怪的是,用户代理可能会有所作为,但我可以让它在没有它的情况下工作(尽管当它不存在时该网站会出错)。

注意:

res$times
##      redirect    namelookup       connect   pretransfer starttransfer         total 
##      0.000000      0.001938      0.158912      0.159512     13.198304     13.629542 

也相当一致(每次请求约15秒)。您可能希望使用httr::timeout()强制执行30秒以上的超时(将其添加到GET()的参数中)。

我知道你正在使用XML包,但你也可能知道那里的命名空间舞蹈:

X_doc <- xmlInternalTreeParse(content(res, as="text", encoding="UTF-8"))

read_xml()调用同样(并且始终如一)。