我认为最好用一个例子来说明这个问题。假设输入如下:
<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
),即,只有那些具有内容的元素(在这个特殊情况下)a
、b
和c
。小的复杂性是,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)
虽然我想知道是否有更“惯用”的方法来解决这个问题,但它似乎或多或少还是有效的?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐