XPathで2番目の要素のテキストを取得しますか?質問する

XPathで2番目の要素のテキストを取得しますか?質問する
<span class='python'>
  <a>google</a>
  <a>chrome</a>
</span>

chromeこれをすでに取得して動作させたいと思っています。

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

これを単一の XPath 式に結合して、リストではなく 1 つの項目を取得したいと思います。
これを試してみましたが、うまくいきません。

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

実際の、簡略化されていない HTML は次のようになります。

<span class='python'>
  <span>
    <span>
      <img></img>
      <a>google</a>
    </span>
    <a>chrome</a>
  </span>
</span>

ベストアンサー1

これを試してみましたが、うまくいきませんでした。

t = item.findtext('.//span[@class="python"]//a[2]')

//これは略語に関するFAQです

.//a[2]意味:親のa2 番目の子である現在のノードのすべての子孫を選択しますa。したがって、具体的な XML ドキュメントに応じて、複数の要素が選択されたり、要素がまったく選択されなかったりする場合があります。

もっと簡単に言えば、[]演算子は よりも優先順位が高くなります//

すべてのノードのうち 1 つ (2 番目) だけを返したい場合は、括弧を使用して必要な優先順位を強制する必要があります。

(.//a)[2]

aこれは実際には現在のノードの2 番目の子孫を選択します。

質問で実際に使用されている表現は、次のように変更します。:

(.//span[@class="python"]//a)[2]

または次のように変更します。

(.//span[@class="python"]//a)[2]/text()

おすすめ記事