我试图在R中的XML包中使用xpathApply函数从html文件中提取某些数据。
但是,在html文档的某些父节点上使用xpathApply之后,结果对象的类变为XMLNodeSet,并且由于该错误消息出现,因此我无法在该对象上进一步使用xpathApply:“UseMethod(“xpathApply”)中的错误:没有将适用于“xpathApply”的适用方法应用于类“XMLNodeSet”的对象”

这是我正在尝试复制我的问题的R脚本(此示例只是一个简单的表,我知道我可以使用readHTMLtable函数,但是我需要使用更多的低级函数来工作,因为我的实际html比这个简单得多 table ):

library(XML)
y <- htmlParse(htmlfile)
x <- xpathApply(y, "//table/tr")
z <- xpathApply(x, "/td")

这是“htmlfile”:
<table>
<tr>
<td> Test1.1 </td> <td> Test1.2 </td>
</tr>
<tr>
<td> Test1.3 </td> <td> Test1.4 </td>
</tr>
</table>

使用xpathApply之后,是否有任何方法可以进一步在节点上工作?还是有其他很好的替代方法可以处理节点中的数据?

最佳答案

一旦有了节点列表,就可以在其上应用功能以提取该节点。功能类似于xmlValuexmlGetAttr...。
例如 :

x <- xpathApply(y, "//table/tr")
sapply(x,xmlValue)          ## it a list of nodes..
 " Test1.1  Test1.2 " " Test1.3  Test1.4 "

这等效于做:
xpathSApply(y,"//table/tr",xmlValue)
" Test1.1  Test1.2 " " Test1.3  Test1.4 "

编辑

我敢肯定,正确的xpath可以解决您的问题。在使用数据库时,您应该学习使用xml文件的知识。 xpath类似于sql查询。它的速度很快,许多浏览器可以帮助您获取正确的xpath。

例如 :
 xpathSApply(y,"//table/tr[2]/td[1]",xmlValue) #  second tr and first td
 [1] " Test1.3 "
 xpathSApply(y,"//table/tr[2]/td[3]",xmlValue) #  second tr and third td

编辑

如果他想复制XML结构,则OP看起来很像(以相同的顺序获取tr和td)

这是方法,我认为这不是更有效的方法...
nn.trs <- length(xpathSApply(y,"//table/tr",I))
lapply(seq(nn.trs),function(i){
       xpathSApply(y,paste("//table/tr[",i,"]/td",sep=''),xmlValue)
})
[[1]]
[1] " Test1.1 " " Test1.2 "

[[2]]
[1] " Test1.3 " " Test1.4 "

如果每个tr的td数都相同,则可以用lapply替换sapply,得到:
    [,1]        [,2]
[1,] " Test1.1 " " Test1.3 "
[2,] " Test1.2 " " Test1.4 "

但我认为在这种情况下,readHtmlTable更好。

关于html - r-xpath应用于XMLNodeSet(带有XML包),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14957632/

10-12 22:58