0

ブラウザ関連 > 表の値取得に苦戦しました。
学びの共有です。

 

目的

  • 検索結果から処理対象案件を識別して処理

 

操作

  • Webページの表から1列目の値を取得

 

対象の表(終了タグ省略)

<table id="abcde">
<th><td>母<td>a<td>i<td>u<td>e<td>o
<tr><td>‐<td>あ<td>い<td>う<td>え<td>お
<tr><td>k<td>か<td>き<td>く<td>け<td>こ
<tr><td>s<td>さ<td>し<td>す<td>せ<td>そ

※ 行は可変

 

表の値取得

XPath://*[@id="abcde"]
行:カウンタ(初期値:2)
列:値⇒1
値を格納する変数:a

 

繰り返し取得を試した結果

  • 変数aに「あ い う え お か き・・・」の順に格納された

  

思いの変遷

  1. 凡ミスをやらかしたか
  2. どう考えても正しく使ってる
  3. バグか
  4. 迷宮入りか

 

よく確認した結果

  • tdの中に、idなしのtableがカパッとハマっていた(入れ子構造、ネスト)
  • tableのネスト位置に規則性あり
  • ブランクに見えるセルも、特定列には必ずtableを内包している

 

対策

  • 行のカウンタを8ずつカウントアップ
  • tableが内包されている行の分を多くカウント
  • 見た目のtr数のカウントと異なる

 

対策の結果

  • 見た目上の(親tableの)1列目の値取得に成功

 

振り返り

  • id="abcde"が、ネストされた表にまでかかっているとは予想外

 

検証

  • 子tableが別のidを持っていたら起こり得ないのだろうか
  • 途中のtableにid="test"を追加 → 追加前後で実行結果に変化なし
  • デベロッパーツールで右クリックメニューからAdd attribute

 

把握した結論

  • //*[@id="abcde"]のかたちで捕まえたテーブルでは、内包するテーブルの行と列も考慮して、行番号と列番号を扱う必要がある

 

推察

  • XPathを工夫すれば、内包するテーブルを除外できるのかも

機会があれば試して続報します。

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