XPath:查找包含某些标记的div

时间:2013-02-05 22:50:41

标签: python html xml xpath lxml

我知道它允许您使用

找到带有<a>标记的div
'//div[a]'

但如果我想要一个包含<a>标记和<p>标记的div,该怎么办。

我尝试过'//div[a][p]'

我还尝试过'//div[a|p]',我认为这会为div提供<a><p>标记,然后我可以检查<div>是否包含<a> }和<p>稍后...但是没有返回的div包含<p>,只有<a>,即使我知道<div>包含两者。< / p>

2 个答案:

答案 0 :(得分:2)

如果您只想选择<div><a>作为子项(即时后代)的<p>元素,那么您的XPath表达式是正确的,问题在于其他地方。

如果您要选择包含 <div><a>的{​​{1}}元素,则应使用<p>轴。

descendant

它将选择以下所有//div[descendant::a and descendant::p]

<div>

答案 1 :(得分:1)

我确信有一个更好的方法,但是直接的kludge就像是:

set(tree.xpath('//div[a]')).intersection(tree.xpath('//div[p]'))

或者这个monstrosity保持简单的XPath:

tree.xpath('//div[a][count(. | //div[p]) = count(//div[p])]')

如果lxml使用XPath 2.0 - 那么你就有了一个交叉运算符,但是唉......