【问题标题】:Xpath to extract text between specific div tag and next divXpath 提取特定 div 标签和下一个 div 之间的文本
【发布时间】:2020-12-08 13:52:09
【问题描述】:

我想提取<p>div 标记“Heading1”和下一个div 标记之间的文本,如下例所示。我不能使用 'heading2 来隔离下一个 div,因为此文本可能会更改。

library(XML)
# create example html
html <- '
<div class="AAA">
<div class="AAA">Heading1</div>
</div>
<p>text1 I want</p>
<p>text2 I want</p>
<p>text3 I want</p>
<div class="AAA">
<div class="AAA">Heading2</div> <!-- Do not always know what this heading is -->
</div>
<p>more text</p>
<p>more text</p>
<p>more text</p>
<div class="AAA">
<div class="AAA">Heading3</div>
</div>'

doc <- htmlParse(html)

xpath <- "//p[preceding::div[@class='AAA' and contains(., 'Heading1')]]"

xpathSApply(doc, xpath, xmlValue)

这工作到这里,但我坚持在下一个 div 限制 xpath。我尝试过使用以下内容,认为它会得到下一个div

"//p[preceding::div[@class='AAA' and contains(., 'Heading1')]and following::div[position()=1]]"

【问题讨论】:

    标签: html r xpath


    【解决方案1】:

    我认为没有必要测试下一个 div。你应该能够做这样的事情......

    //p[preceding-sibling::div[1][normalize-space()='Heading1']]
    

    或者如果课程很重要的话……

    //p[preceding-sibling::div[1][@class='AAA'][normalize-space()='Heading1']]
    

    或者如果你仍然需要使用contains()...

    //p[preceding-sibling::div[1][@class='AAA'][contains(normalize-space(),'Heading1')]]
    

    【讨论】:

    • Id' 如果您能解释一下 xpath 的规范化空间部分,我将不胜感激 - 我不清楚它是如何工作的(即去除空白?)
    • @CCID - 它返回上下文节点的字符串值,删除了前导/尾随空格并将多个空格替换为单个空格。 (See here.) 我在这里使用它,所以外部 div 的空白不会成为问题。仅将contains() 用于Heading1 时,您将不需要它。
    • @CCID - 我可能还应该注意到,如果您添加位置谓词,您的初始尝试工作正常://p[preceding::div[1][@class='AAA' and contains(., 'Heading1')]]
    【解决方案2】:

    试试这个

    //p[preceding-sibling::div[div="Heading1"] and count(preceding-sibling::div[div])=1]
    

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 2013-03-18
      • 2023-01-04
      • 2015-10-22
      • 1970-01-01
      • 2020-04-19
      相关资源
      最近更新 更多