通过XPath选择给定类型的第一组连续子元素

2024-09-25 02:26:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我认为最好用一个例子来说明这个问题。假设输入如下:

<div id='content'>
    <h1></h1>
    <h3></h3>
    <p>a</p>
    <p>b</p>
    <p>c</p>
    <div><p>x</p></div>
    <p>d</p>
    <h2></h2>
    <p>e</p>
</div>

现在,我想在根div元素的子元素中选择连续p元素的第一组(Z),即,只有那些具有内容的元素(在这个特殊情况下)abc。小的复杂性是,Z中的第一个p元素可能在其父元素的上下文中被一个任意序列的“非p”元素所先行,而Z的最后一个p元素可能以类似的方式后跟任意标记。你知道吗

为此,我尝试使用以下XPath方法(在lxml中):

from lxml import etree

tree = etree.fromstring(r'''
    <div id='content'>
        <h1></h1>
        <h3></h3>
        <p>a</p>
        <p>b</p>
        <p>c</p>
        <div><p>x</p></div>
        <p>d</p>
        <h2></h2>
        <p>e</p>
    </div>
''')

q=r'''
    /div[@id="content"]/p[count(preceding-sibling::*[not(self::p)]) 
    =
    count(/div[@id="content"]/p[1]/preceding-sibling::*)]
'''
for el in tree.xpath(q):
    print(el.text)

虽然我想知道是否有更“惯用”的方法来解决这个问题,但它似乎或多或少还是有效的?你知道吗


Tags: 方法dividtree元素counth2content