0

我想使用 XPath 返回每个锚标记内链接的字符向量。

我可以返回感兴趣的表

library(RCurl)
library(XML)
url <- "http://dps.alaska.gov/sorweb/aspx/sorcra1.aspx"
readHTMLTable(url, useInternalNodes = T)[[3]]

但我还想返回与名称关联的每个锚标记中的链接。这就是我到目前为止所拥有的。

dat <- htmlTreeParse(url, useInternalNodes = T)
getNodeSet(dat, "///tr/td/a")

所以我的输出是一个 RCurl 对象的列表,而不是所需的字符向量,并且除了我的表中的标签之外,我还包含了其他标签,但 XPath 不完美。

所以我的问题是两个部分。如何将 getNodeSet 元素输出转换为带有标签的字符向量,什么是获得所需 XPath 搜索的有效方法?

4

1 回答 1

2

getNodeSet 返回的对象似乎很有趣。当你 print() 它们时,你会得到一个格式良好的节点字符串表示,但是当你尝试 as.character() 它们时,它会爆炸。

一种直接的方法是检查函数 print.XMLInternalNode 的代码并查看它的作用。

> getAnywhere(print.XMLInternalNode)
A single object matching ‘print.XMLInternalNode’ was found
It was found in the following places
  registered S3 method for print from namespace XML
  namespace:XML
with value

function (x, ...)
{
    cat(as(x, "character"), "\n")
}
<environment: namespace:XML>

啊哈!返回的 XMLInternalNode 对象是 S4,因此它们没有为它们设置通常的 as.whatever() S3 方法。

因此,要将所有结果作为字符向量,我会这样做:

> dat <- htmlTreeParse(url, useInternalNodes=T)
> x<-getNodeSet(dat,"///tr/td/a")
> sapply(x, function(n) {as(n, "character")})

至于您问题的第二部分,我建议您现在不要担心优化 XPath 查询。先让你的东西工作。一旦你完成了所有工作,如果它足够快,你就完成了。如果不是,则开始分析您的代码以确定瓶颈在哪里。它甚至可能不是 XPath 让你慢下来(只是猜测,但从 web 服务器检索页面所花费的时间可能是你执行时间的最大部分)。

于 2013-11-09T23:34:44.630 回答