我正在使用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) })
当我将每个节点打印到控制台时,会返回不同的表,但是为什么我会观察到这种行为?我需要做哪些额外的步骤才能返回所需的输出?
答案 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]")
}
)