我正在尝试使用XML包从html文档中提取数据。 我如下:
library(XML)
sink("parse.txt")
parse<-htmlParse(file = "jdwaz.html",encoding = "GBK")
a=getNodeSet(parse,'//div[@class="amount"]')
print(a)
然后class(a)返回“XMLNodeSet”,其内容在txt文件中如下所示
[[1]]
<div class="amount">
<span>总额 ¥113.80</span> <br /><span class="ftx-13">在线支付</span>
</div>
[[2]]
<div class="amount">
<span>总额 ¥99.00</span> <br /><span class="ftx-13">在线支付</span>
</div>
我只显示20个“a”中的2个
class(a [1])返回“list” 我想获得内容“总额¥99.00”。 我在r - xpathApply on XMLNodeSet (with XML package)找到了一种方法 它使用xmlvalue来获取如下文本:
x <- xpathApply(y, "//table/tr")
sapply(x,xmlValue) ## it a list of nodes..
" Test1.1 Test1.2 " " Test1.3 Test1.4 "
但它不符合我的情况。 当我输入xmlvalue(a)时,它返回:
Error in UseMethod("xmlValue") : no applicable method for 'xmlValue' applied to an object of class "XMLNodeSet"
我没有找到合适的方法来处理XMLNodeSet类。 帮助!
答案 0 :(得分:1)
要查询XML节点集,请使用前导&#34;。&#34;所以它相对于当前节点。由于您有两个span标记,因此请获取没有class属性的标记。
sapply(a, function(x) xpathSApply(x, ".//span[not(@class)]", xmlValue)) #OR
sapply(a, xpathSApply, ".//span[not(@class)]", xmlValue)
[1] "总额 ¥113.80" "总额 ¥99.00"
答案 1 :(得分:0)
我正在使用rvest
软件包从网页中删除数据并遇到与您类似的问题。
在rvest
中,您可以通过html_nodes(read_html(url), css)
获取数据,以获得与您的a
类似的xml节点集。我学会了一种通过简单函数html_text()
从xml节点集中提取内容的快速方法。要使用它,请将html_text()
包裹在xml节点集周围。
假设以下示例根据其域获取公司名称:
library('rvest')
url <- 'https://who.is/whois/gmail.com'
webpage <- read_html(url)
a <- html_nodes(webpage,'.col-md-7')
a[1] # returns the long xml nodeset
html_text(a) # converts the xml into vector with content extracted
html_text(a)[2] # gives you the company name
看起来rvest
是一个受欢迎的网络数据报废软件包,并且还有大量的帮助资源。