1

表記統一が不充分でした。
採用したXPathの末尾は//a[text()="CD"]です。
「レコード」なら処理を見送ります。

HTMLのA列について、抜けてたaタグを補完しました。
不親切過ぎました。
すぐ試せるようにしました。
メモ帳にコピペしてサンプル.htmlとしてUTF-8で保存、Chrome等にドラッグして開きます。

 

 

XPathでdescendantを初めて使いました。
学びのお裾分け 兼 備忘録です。もっとスマートな手があれば教えてください。

 

ヤマ:ロックで状態が良いCDをクリックしたい

せっかくなので画像を追加しておきます。

<table id="a">
  <tr><td>リンク</td><td>ジャンル</td><td>状態</td></tr>
  <tr><td>レコード</td><td>ジャズ</td><td>良い</td></tr>
  <tr><td>CD</td><td>ロック</td><td>良い</td></tr>
  <tr><td>CD</td><td>ロック</td><td>悪い</td></tr>
</table>

<html>
<head>
  <title>サンプル</title>
</head>
<body>
<table id="a" border="1">
  <tr>
    <td>リンク</td>
    <td>ジャンル</td>
    <td>状態</td>
  </tr>
  <tr>
    <td><a href="a.html">レコード</a></td>
    <td>ジャズ</td>
    <td>良い</td>
  </tr>
  <tr>
    <td><a href="b.html">CD</a></td>
    <td>ロック</td>
    <td>良い</td>
  </tr>
  <tr>
    <td><a href="c.html">CD</a></td>
    <td>ロック</td>
    <td>悪い</td>
  </tr>
</table>
</body>
</html>

 

今回「クリック」で採用したXPath

//table[@id="a"]//tr[descendant::td[text()="ロック"] and descendant::td[text()="良い"]]//a[text()="AAAAAA"]

//table[@id="a"]//tr[descendant::td[text()="ロック"] and descendant::td[text()="良い"]]//a[text()="CD"]

 

これまでの思考回路

  1. 該当セルを一意に特定
  2. セルから相対移動して行を特定
  3. 行から相対移動した列を操作
  • 複数列が条件になると、1ライブラリとはいかず、「分岐」を経由してた気がする
  • 残念に感じてた

 

前進のきっかけになった情報

Selenium、複数の要素を含むテーブル行にマッチするxpath(解決済み)
https://www.coderwd.com/article/seleniumxpath-37065

これで見つけました。

https://www.google.com/search?q=xpath+表+行+値+複数セル

 

ビジュアルで解った気になれた情報

図解!XPathでスクレイピングを極めろ!(Python、containsでの属性・テキストの取得など) - AI-interのPython3入門
https://ai-inter1.com/xpath/#st-toc-h-40

後ろの子孫要素を取得: descendant

 

より理解が深まりそうな情報

XPathにおける//*とdescendant::*の違い - os0x.blog
https://os0x.hatenablog.com/entry/20080711/1215749066

 

実際のシナリオでは、運用部署のニーズを踏まえ、該当の行がない場合はジャンルと状態をログに出力してスキップさせました。

例外処理
 正常系
  クリック
 異常系
  値の取得:ジャンル
  値の取得:状態
  変数値設定:スキップフラグをオンに

anothersolution 回答した質問
回答とコメントは、会員登録(無料)で閲覧できるようになります。