0

我知道它可以让你找到一个带有<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 包含两者.

4

2 回答 2

2

如果您只想选择<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>
于 2013-02-05T23:09:59.073 回答
1

我敢肯定有一个更好的方法,但直接的 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 运算符,但是唉......

于 2013-02-05T23:08:09.943 回答