表の値取得の落とし穴
ブラウザ関連 > 表の値取得に苦戦しました。
学びの共有です。
目的
- 検索結果から処理対象案件を識別して処理
操作
- 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に「あ い う え お か き・・・」の順に格納された
思いの変遷
- 凡ミスをやらかしたか
- どう考えても正しく使ってる
- バグか
- 迷宮入りか
よく確認した結果
- tdの中に、idなしのtableがカパッとハマっていた(入れ子構造、ネスト)
- tableのネスト位置に規則性あり
- ブランクに見えるセルも、特定列には必ずtableを内包している
対策
- 行のカウンタを8ずつカウントアップ
- tableが内包されている行の分を多くカウント
- 見た目のtr数のカウントと異なる
対策の結果
- 見た目上の(親tableの)1列目の値取得に成功
振り返り
- id="abcde"が、ネストされた表にまでかかっているとは予想外
検証
- 子tableが別のidを持っていたら起こり得ないのだろうか
- 途中のtableにid="test"を追加 → 追加前後で実行結果に変化なし
- デベロッパーツールで右クリックメニューからAdd attribute
把握した結論
- //*[@id="abcde"]のかたちで捕まえたテーブルでは、内包するテーブルの行と列も考慮して、行番号と列番号を扱う必要がある
推察
- XPathを工夫すれば、内包するテーブルを除外できるのかも
機会があれば試して続報します。
anothersolution 質問の投稿
回答とコメントは、会員登録(無料)で閲覧できるようになります。
新規登録