【问题标题】:R, XPath, text scraping : get the text inside a node, while filtering on the attribute value of one of its descendantR,XPath,文本抓取:获取节点内的文本,同时过滤其后代之一的属性值
【发布时间】:2021-09-21 09:08:14
【问题描述】:

这是一个快速的模拟代码。我想要得到的是一个字符向量,其中包含每个 p 节点的文本内容,其后代 a 具有其属性 href = "value1"。

<doc>
    <div class="intervention">
        <p>
            <a></a>
            <b>
                <a href="value1">xxx</a>
            </b>
            text1
        </p>
        <p>
            <a></a>
            <b>
                <a href="value2">xxx</a>
            </b>
            text2
        </p>
        <p>
            <a></a>
            <b>
                <a href="value1">xxx</a>
            </b>
            text3
        </p>
    </div>

    <div class="intervention">
        <p>
            <a></a>
            <b>
                <a href="value2">xxx</a>
            </b>
            text4
        </p>
        <p>
            <a></a>
            <b>
                <a href="value1">xxx</a>
            </b>
            text5
        </p>
        <p>
            <a></a>
            <b>
                <a href="value1">xxx</a>
            </b>
            text6
        </p>
    </div>
</doc>

也就是说,我想得到这个向量:

c("xxxtext1","xxxtext3","xxxtext5","xxxtext6")

您能帮我找到合适的 XPath 吗?到目前为止,我已经找到了这个给我 p 节点中所有文本内容的内容,但是我无法让它根据 a 的 href 值进行过滤。

"//div[@class='intervention']//*[not(self::script)]"

非常感谢您的帮助!

【问题讨论】:

    标签: r web-scraping xpath


    【解决方案1】:

    您的 xpath 应该是 //a[@href='value1']/ancestor::p

    例如:

    library(xml2)
    
    result <- xml_text(xml_find_all(doc, xpath = "//a[@href='value1']/ancestor::p"))
    
    gsub("\\s", "", result) # Remove line breaks and spaces
    #> [1] "xxxtext1" "xxxtext3" "xxxtext5" "xxxtext6"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 2014-01-14
      相关资源
      最近更新 更多