我知道它可以让你找到一个带有<a>
标签的 div
'//div[a]'
但是如果我想要一个带有<a>
标签和<p>
标签的 div 怎么办。
我试着做'//div[a][p]'
。
我也尝试过'//div[a|p]'
我认为会给 div 带有<a>
or<p>
标记的操作,然后我可以检查它是否<div>
包含 an<a>
和 a<p>
之后...但是返回的 div 都不包含 a <p>
,<a>
即使我知道有<div>
s 包含两者.
如果您只想选择<div>
具有<a>
和<p>
作为子元素(直接后代)的元素,那么您的 XPath 表达式是正确的,问题出在其他地方。
如果您打算选择包含and的<div>
元素,则应使用轴。 <a>
<p>
descendant
//div[descendant::a and descendant::p]
它将选择以下所有<div>
<root>
<div>
<a>Dolor</a>
<p>et calculum</p>
</div>
<div>
<a>Dolor<p>et calculum</p></a>
</div>
<div>
<ul>
<li><a>Foo</a><li>
</ul>
<p>Bar</p>
</div>
</root>
我敢肯定有一个更好的方法,但直接的 kludge 是这样的:
set(tree.xpath('//div[a]')).intersection(tree.xpath('//div[p]'))
或者这个怪物保持简单的 XPath:
tree.xpath('//div[a][count(. | //div[p]) = count(//div[p])]')
如果lxml
使用 XPath 2.0 - 那么你会有一个 intersect 运算符,但是唉......