R:XML:麻烦在NodeSet上循环

时间:2015-08-29 04:51:57

标签: xml r

我正在使用R中的 XML 包从following file检索信息。我检索了一组表节点,然后想进一步使用 xpathApply 在每个节点上

doc = htmlParse(file.link)
tableNodes = getNodeSet(doc, "//table")

for(i in 1:length(tableNodes)){
    print(xpathApply(tableNodes[[i]],"//tr[1]/td[1]",xmlValue))
}

这应该返回文件中每个表的左上角元素,但由于某种原因,每次迭代都会返回第一个表的左上角元素。也就是说,对于每一个我,我得到;

"事業所名(所在地)"

相反,它应该返回;

i=1: "事業所名(所在地)"
i=2: "会社名事業所名(主な所在地)"
i=3: "会社名(所在地)"
...

关注this post后,我也尝试使用 sapply ,但获得了类似的结果 - 只返回第一个表中的条目。

sapply(tableNodes, function(x) { xpathApply(x,"//tr[1]/td[1]",xmlValue) })

当我将每个节点打印到控制台时,会返回不同的表,但是为什么我会观察到这种行为?我需要做哪些额外的步骤才能返回所需的输出?

1 个答案:

答案 0 :(得分:2)

问题是查询中的前导//,这意味着从根目录开始的XML文档中的任何位置。请参阅xpath expression

这是一个例子。

library(XML)

xml <- htmlParse("http://www.w3schools.com/html/html_tables.asp")

tableNodes <- getNodeSet(xml,"//table")

sapply(
  1:length(tableNodes)
  ,function(i) {
    getNodeSet(tableNodes[[i]],"tr[1]/td[1]")
  }
)