使用xpathSApply在R中刮取XML属性
我正在使用xpathSApply(在XML包中)在R中抓取XML,但在提取属性时遇到了问题 首先,一个相关的XML片段:使用xpathSApply在R中刮取XML属性,xml,r,xpath,Xml,R,Xpath,我正在使用xpathSApply(在XML包中)在R中抓取XML,但在提取属性时遇到了问题 首先,一个相关的XML片段: <div class="offer-name"> <a href="http://www.somesite.com" itemprop="name">Fancy Product</a> </div> 我已使用以下工具成功推出了“花式产品”(即元素?): 产品href是一个属性。您可以选择适当的
<div class="offer-name">
<a href="http://www.somesite.com" itemprop="name">Fancy Product</a>
</div>
我已使用以下工具成功推出了“花式产品”(即元素?):
产品href
是一个属性。您可以选择适当的节点//div/a
,并使用xmlGetAttr
函数和name=href
:
'<div class="offer-name">
<a href="http://www.somesite.com" itemprop="name">Fancy Product</a>
</div>' -> xData
library(XML)
parsedHTML <- xmlParse(xData)
Products <- xpathSApply(parsedHTML, "//div[@class='offer-name']", xmlValue)
hrefs <- xpathSApply(parsedHTML, "//div/a", xmlGetAttr, 'href')
> hrefs
[1] "http://www.somesite.com"
'
'->扩展数据
库(XML)
parsedHTML您也可以直接使用XPath来完成这项工作,而不必使用xpathsaply(…)
xData-XML-syntactive-sugar+1这也很有效,在其他情况下可能是更好的解决方案,尽管我发现在URL中包含了“href”,使其效果稍差。URL中没有包含href!这将返回一个命名向量。”href'是名称。很公平-我错了,我还是新手,在使用cbind()组合所需数据时,得到了一个额外的列。感谢您的帮助。我在一个包含20000个要提取的数字数据的大文件上对其进行了基准测试,使用xpathApply
的版本速度慢了9倍。这非常有效。我选择这个答案而不是jlhoward,因为它是我使用的格式(并不意味着它对所有用户都更好),并且输出的hrefs可以很容易地作为一个列进行cbind。jlhoward的响应生成了一个cbind为2列的对象(其中一列是all href),因此需要做更多的工作。如果我有这个名声,我会+1。
library(XML)
library(httr)
content2 = paste(readLines(file.choose()), collapse = "\n") # User will select file.
parsedHTML = htmlParse(content2,asText=TRUE)
Products <- xpathSApply(parsedHTML, "//div[@class='offer-name']", xmlValue)
'<div class="offer-name">
<a href="http://www.somesite.com" itemprop="name">Fancy Product</a>
</div>' -> xData
library(XML)
parsedHTML <- xmlParse(xData)
Products <- xpathSApply(parsedHTML, "//div[@class='offer-name']", xmlValue)
hrefs <- xpathSApply(parsedHTML, "//div/a", xmlGetAttr, 'href')
> hrefs
[1] "http://www.somesite.com"
xData <- '<div class="offer-name">
<a href="http://www.somesite.com" itemprop="name">Fancy Product</a>
</div>'
library(XML)
parsedHTML <- xmlParse(xData)
hrefs <- unlist(parsedHTML["//div[@class='offer-name']/a/@href"])
hrefs
# href
# "http://www.somesite.com"