我认为用一个例子来说明这个问题是最好的。让我们假设以下输入:
<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
),即仅包含内容的元素(在这个特殊情况)a
,b
和c
。小的复杂性是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;解决这个问题?