但是,在HTML文档的某些父节点上使用xpathApply后,生成的对象的类变为XMLNodeSet,我无法在此类对象上进一步使用xpathApply,因为出现此错误消息:“UseMethod(”xpathApply“)中的错误:没有适用于’xpathApply’的方法应用于类“XMLNodeSet”的对象“
这是我试图复制我的问题的R脚本(这个例子只是一个简单的表,我知道我可以使用readHTMLtable函数,但我需要使用更多的低级函数才能工作,因为我的实际HTML比这个简单更复杂表):
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后,是否有任何方法可以在节点上进一步工作?或者还有其他好的替代方案可以解决节点中的数据吗?
解决方法 获得节点列表后,可以对其应用函数以提取节点.函数如xmlValue或xmlGetAttr ….例如 :
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
编辑
OP看起来好像他想复制XML结构(以相同的顺序获得tr和td)
这是方式,我不认为是更有效的方式……
nn.trs <- length(xpathSApply(y,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的数量都相同,你可以用sapply替换lapply,你得到:
[,1] [,2] [1,] " Test1.1 " " Test1.3 "[2,] " Test1.2 " " Test1.4 "
但我认为在这种情况下readHTMLtable更好..
总结以上是内存溢出为你收集整理的html – r – xpathApply在XMLNodeSet上(带有XML包)全部内容,希望文章能够帮你解决html – r – xpathApply在XMLNodeSet上(带有XML包)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)