如何使用XPath查询获取R中的字符向量列表?

时间:2013-11-09 22:56:20

标签: xml r xpath xml-parsing rcurl

我想使用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搜索的有效方法是什么?

1 个答案:

答案 0 :(得分:2)

似乎getNodeSet返回的对象表现得很有趣。当你打印()它们时,你得到一个格式很好的字符串表示节点,但是当你尝试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会减慢你的速度(只是猜测,但是从网络服务器检索页面所花费的时间可能是你执行时间的最大部分)。