似乎您正在尝试抓取一个在 JSON 中显示数据的网站。
为此,除了抓取网站所需执行的“常规步骤”之外,您还需要处理解析和操作 JSON 数据:
通常的做法
如果你有一个易于抓取的 HTML 表格,这应该可以:
require("XML")
x <- readHTMLTable(
doc="swww.someurl.com"
)
否则你肯定需要使用一些XPath 来访问你感兴趣的节点。
这通常涉及通过htmlTreeParse() 解析HTML 代码并通过getNodeSet() 等获取相应的节点:
x <- htmlTreeParse(
file="swww.someurl.com",
isURL=TRUE,
useInternalNodes=TRUE
)
res <- getNodeSet(x, <your-xpath-statement>)
包含 JSON 数据的方法
解析 HTML 代码:
x <- htmlTreeParse(
file="http://q.stock.sohu.com/hisHq?code=cn_000002&start=20131120&end=20140318&stat=1&order=D&period=d&callback=historySearchHandler&rt=jsonp&r=0.8740235545448934&0.28161772061461654",
isURL=TRUE,
useInternalNodes=TRUE
)
检索实际的 JSON 数据:
json <- getNodeSet(x, "//body/p")
json <- xmlValue(json[[1]])
摆脱非 JSON 组件:
json <- gsub("historySearchHandler\\(", "", json, perl=TRUE)
json <- gsub("\\)$", "", json, perl=TRUE)
解析 JSON 数据:
require("jsonlite")
fromJSON(json, simplifyVector=FALSE)
[[1]]
[[1]]$status
[1] 0
[[1]]$hq
[[1]]$hq[[1]]
[[1]]$hq[[1]][[1]]
[1] "2014-03-18"
[[1]]$hq[[1]][[2]]
[1] "7.76"
[...]
现在你需要把它变成一个更像data.frame的顺序(想到的方法是do.call()、rbind()、cbind)。
编码
迟早(而不是我们在这个例子中看到的迟早),你会遇到编码问题("ÀÛ¼Æ:" 之类的东西)。
您可以在解析 HTML 代码时直接使用不同的编码(htmlTreeParse() 中的参数encoding)或通过Encoding“之后”修改字符串的编码。不过,我无法根据您的价值观完全正确。编码问题可能会很痛苦。
一般建议
我建议您将来选择基于英语的示例(在这种情况下是基于英语的网站),否则您会极大地限制可能能够帮助您的人数。