用XPath获取第二个元素文本?

20 python xpath lxml

<span class='python'>
  <a>google</a>
  <a>chrome</a>
</span>
Run Code Online (Sandbox Code Playgroud)

我想得到chrome并让它像这样工作.

q = item.findall('.//span[@class="python"]//a')
t = q[1].text # first element = 0
Run Code Online (Sandbox Code Playgroud)

我想将它组合成一个XPath表达式,只需要一个项而不是列表.
我试过这个,但它不起作用.

t = item.findtext('.//span[@class="python"]//a[2]') # first element = 1
Run Code Online (Sandbox Code Playgroud)

实际的,而不是简化的HTML就是这样的.

<span class='python'>
  <span>
    <span>
      <img></img>
      <a>google</a>
    </span>
    <a>chrome</a>
  </span>
</span>
Run Code Online (Sandbox Code Playgroud)

Dim*_*hev 35

我试过这个,但它不起作用.

t = item.findtext('.//span[@class="python"]//a[2]')
Run Code Online (Sandbox Code Playgroud)

这是关于//缩写的常见问题解答.

.//a[2]表示:选择a当前节点的所有后代,这些后代是a其父节点的第二个子节点.因此,这可能会选择多个元素或不选择任何元素 - 具体取决于具体的XML文档.

更简单地说,[]运营商的优先级高于//.

如果只需要返回所有节点中的一个(第二个),则必须使用括号来强制所需的优先级:

(.//a)[2]

这确实选择a了当前节点的第二个后代.

对于问题中使用的实际表达式,请将其更改为:

(.//span[@class="python"]//a)[2]
Run Code Online (Sandbox Code Playgroud)

或将其更改为:

(.//span[@class="python"]//a)[2]/text()
Run Code Online (Sandbox Code Playgroud)