通过XPath

时间:2016-08-12 16:49:49

标签: python xml xpath

我认为用一个例子来说明这个问题是最好的。让我们假设以下输入:

<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元素的子元素中选择连续Z元素的第一组(p),即仅包含内容的元素(在这个特殊情况)abc。小的复杂性是p中的第一个Z元素可能在其父级的上下文之前由任意序列的非p&#39 ;&#39;元素,而p的最后一个Z元素可能以类似的方式后跟任意标记。

为此,我尝试使用以下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)

似乎它或多或少都有效,尽管我想知道是否还有更多的&#34;惯用的&#34;解决这个问题?

0 个答案:

没有答案