我正在尝试下载天气数据,类似于此处的问题:How to parse XML to R data frame
但是在示例中运行第一行时,出现“错误:1:无法加载HTTP资源”。我检查了网址是否有效。这是我指的行:

data <- xmlParse("http://forecast.weather.gov/MapClick.php?lat=29.803&lon=-82.411&FcstType=digitalDWML")


我设法找到了以下解决方案,但想了解为什么第一行不起作用。

testfile <- "G:/Self Improvement/R Working Directory/test.xml"
url <- "http://forecast.weather.gov/MapClick.php?lat=29.803&lon=-82.411&FcstType=digitalDWML"
download.file(url, testfile, mode="wb") # get data into test
data <- xmlParse(testfile)


赞赏任何见解。

最佳答案

您可以通过如下设置UserAgent来下载文件:

require(httr)
UA <- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36"
my_url <- "http://forecast.weather.gov/MapClick.php?lat=29.803&lon=-82.411&FcstType=digitalDWML"
doc <- GET(my_url, user_agent(UA))


现在看看content(doc, "text"),它就是您在浏览器中看到的文件

然后,您可以通过XMLxml2对其进行解析。我发现xml2更容易,但这只是我的口味。两者都可以。

data <- XML::xmlParse(content(doc, "text"))
data2 <- xml2::read_xml(content(doc, "text"))


为什么必须使用用户代理?
从RCurl常见问题解答中:http://www.omegahat.org/RCurl/FAQ.html


为什么RCurl不为某些站点所需的useragent提供默认值?
这是一个哲学问题。首先,libcurl没有指定默认值,它是供其他人构建应用程序的框架。同样,RCurl是R程序员创建用于发出“ Web”请求的应用程序的通用框架。因此,我们也没有设置用户代理。我们期望R程序员能够做到这一点。使用R包中的RCurl向站点发出请求的R程序员应使用包名称(以及R的版本)作为用户代理,并在所有请求中指定此名称。
基本上,我们希望其他人为useragent指定有意义的值,以便他们正确地标识自己。

请注意,用户(不建议程序员使用)可以通过R的option()函数设置名为RCurlOptions的R选项。该值应该是已命名的curl选项的列表。在每个RCurl请求中使用此值,将这些值与调用中指定的值合并。这样就可以提供默认值。


我怀疑http://forecast.weather.gov/在没有UserAgent的情况下拒绝所有请求。

关于r - R XML解析网址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32019566/

10-10 17:17