我知道它允许您使用
找到带有<a>
标记的div
'//div[a]'
但如果我想要一个包含<a>
标记和<p>
标记的div,该怎么办。
我尝试过'//div[a][p]'
。
我还尝试过'//div[a|p]'
,我认为这会为div提供<a>
或<p>
标记,然后我可以检查<div>
是否包含<a>
}和<p>
稍后...但是没有返回的div包含<p>
,只有<a>
,即使我知道<div>
包含两者。< / p>
答案 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 - 那么你就有了一个交叉运算符,但是唉......