【问题标题】:Using xpathSApply to scrape XML attributes in R使用 xpathSApply 在 R 中抓取 XML 属性
【发布时间】:2014-08-14 18:42:50
【问题描述】:

我正在使用 xpathSApply(在 XML 包中)在 R 中抓取 XML,并且无法提取属性。

首先,XML的相关sn-p:

 <div class="offer-name">
        <a href="http://www.somesite.com" itemprop="name">Fancy Product</a>
      </div>

我已使用以下方法成功提取了“花式产品”(即元素?):

Products <- xpathSApply(parsedHTML, "//div[@class='offer-name']", xmlValue) 

这花了一些时间(我是 n00b),但文档很好,我可以利用这里回答的几个问题。我不知道如何将“http://www.somesite.com”拉出来(属性?)。我推测它涉及将第 3 项从“xmlValue”更改为“xmlGetAttr”,但我可能会完全放弃。

仅供参考(1)在我粘贴的 sn-p 上方还有 2 个父

和(2)这里是缩写的完整代码(我认为它不相关,但为了完整起见包括在内) 是:
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) 

【问题讨论】:

    标签: xml r xpath


    【解决方案1】:

    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"
    

    【讨论】:

    • 这非常有效。我选择这个答案而不是 jlhoward 对我来说是最好的,因为它是我使用的格式(并不意味着它对所有用户都更好),并且输出的 href 可以很容易地 cbind 为单列。 jlhoward 的响应导致对象 cbind 为 2 列(一列都是 href),因此需要做更多的工作。如果我有声望会 +1。
    【解决方案2】:

    您也可以直接使用 XPath 执行此操作,而不使用 xpathSApply(...)。

    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" 
    

    【讨论】:

    • XML 语法糖 +1
    • 这也有效,并且在其他情况下可能是更好的解决方案,尽管我发现在 URL 中包含 'href' 使其成为一种不太有效的方法
    • href 不包含在网址中!这将返回一个命名向量。 'href' 是名称。
    • 很公平 - 我的错误,我还是新手,当我使用 cbind() 组合我需要的数据时,我得到了一个额外的列。感谢您的帮助。
    • 我在一个包含 20000 个数字数据的大文件上对其进行了基准测试,xpathApply 的版本慢了 9 倍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2023-03-07
    • 2020-01-25
    • 2023-03-09
    相关资源
    最近更新 更多