【问题标题】:XPath to select all elements between two headings?XPath 选择两个标题之间的所有元素?
【发布时间】:2017-03-30 15:43:00
【问题描述】:
<h2>Headline 1</h2>
<p>some text</p>
<p>some more text</p>
<ul>
<li>list item 1</li>
<li>list item 2</li>
</ul>
<p>more text</p>
<h2>Headline 2</h2>

我在网页中有上述内容,我希望能够定位包含文本 'Headline 1' 的第一个 h2 之后的所有元素,但不包括包含文本 'Headline 2' 的元素 h2 .

我可以像这样定位元素:

//*[count(preceding-sibling::hr)=1]

但这并不特定于所包含的文本,因此如果页面发生变化,那么 xpath 可能指向完全不同的东西。

我想要的 sudo 代码术语是这样的:

给我标题 'Headline 1' 和 标头'Headline 2' 包括'Headline 1'

这可能吗?

【问题讨论】:

    标签: html xml xpath


    【解决方案1】:

    这个 XPath,

    //*[    preceding-sibling::h2[. = 'Headline 1'] 
        and following-sibling::h2[. = 'Headline 2']]
    

    将选择h2s 之间字符串值为'Headline 1''Headline 2' 的所有元素:

    <p>some text</p>
    <p>some more text</p>
    <ul>
    <li>list item 1</li>
    <li>list item 2</li>
    </ul>
    <p>more text</p>
    

    Andersson 在 cmets 中指出,OP 希望将第一个 h2 包含在选择中。

    安德森最初的想法是可行的:

    //h2[. = 'Headline 1'] |
    //*[    preceding-sibling::h2[. = 'Headline 1'] 
        and following-sibling::h2[. = 'Headline 2']]
    

    这是另一种方式:

    //*[self::h2[. = 'Headline 1']
        or (    preceding-sibling::h2[. = 'Headline 1'] 
            and following-sibling::h2[. = 'Headline 2']]
    

    或者,可能是理想的方式:

    //h2[. = 'Headline 2']
        /preceding-sibling::*[not(following-sibling::h2[. = 'Heading 1'])]
    

    因为它避免了必须指定 'Heading 1' 两次。

    【讨论】:

      【解决方案2】:

      如果尝试类似的东西会怎样

      //*[text()="Headline 1"]/following-sibling::*
      

      【讨论】:

        【解决方案3】:
        //h2[contains(.,'Headline 1')]//*
        

        将返回标题下方的每个元素。您可以使用

        进一步缩小范围
        //h2[contains(.,'Headline 1')]//p
        

        用于段落文本,但不包括 li 元素。

        【讨论】:

        • 再次查看我用于测试的 HTML 代码后,我意识到它在 中。您显然是正确的,谢谢您指出。
        猜你喜欢
        • 2012-06-07
        • 2021-05-10
        • 1970-01-01
        • 2017-07-23
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        • 2011-06-11
        • 1970-01-01
        相关资源
        最近更新 更多