从XMLNodeSet中提取数据

时间:2017-06-28 02:46:58

标签: r xml xpath xmlnodelist

我正在尝试使用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类。 帮助!

2 个答案:

答案 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是一个受欢迎的网络数据报废软件包,并且还有大量的帮助资源。