XPathでlabelのテキストを掴みたい
※ 最下部にサンプルHTMLを追記しました。
ブラウザ操作です。
labelのテキストを取得したいです。
主にcheckboxとradioのlabelです。
inputとlabelの位置関係を問わず、何とか1つのXPathで表現したい。
ケース1~5をまるっとカバーするXPathなんてあるものでしょうか。
お知恵を拝借させてください。
(WinActor7211)
ケース1
<input type="checkbox" id="check1">
<label for="check1">同意する</label>
- ひとまずこれを利用中
//input[@id="check1"]/following-sibling::label[1]
ケース2
<label for="check1">同意する</label>
<input type="checkbox" id="check1">
- preseding-siblingでいけそう
- or条件で繋ぐイメージ
- 軸部分を複数条件にしてる例を見つけられず
- ()をうまく使えば攻略できるのかどうか
ケース3
<label for="check1">
同意する
<input type="checkbox" id="check1">
</label>
- 階層構造が複数あるとより難しく感じがち
- 両階層をカバーしたことがあった
https://winactor.com/questions/?q=Chrome値の取得で両階層の別idに対応
ケース4
<label for="check1">
<input type="checkbox" id="check1">
同意する
</label>
- 前後逆のケースも考慮できたらベター
ケース5
<label>
<input type="checkbox" id="check1">
同意する
</label>
- idで紐づけられてないケースもあったりする
実際には、ラジオボタンやチェックボックスがオンのラベルを取得したいです。
ラジオボタンやチェックボックス自体のXPathに特にハードルはありません。
「チェック状態取得」に魔改造を施す算段です。
- オンの場合だけlabelの値を返す
- checkboxやradioで同じnameのグループをカンマ区切りでまとめて取得まで到達できればベター
- 「チェックオンラベル取得」
デジャブ感防止のためのURL
https://winactor.com/questions/question/chromeのシナリオでtd内にあるラジオボタンオンの値を/
- スクリプトの工夫でひとまず切り抜けてきた経緯はある
- inputとlabelの位置関係のバリエーションに充分に対処できてなかった
軸、ノードテスト、述語等の用語の情報
クローラ作成に必須!XPATHの記法まとめ #クローラー - Qiita
https://qiita.com/rllllho/items/cb1187cec0fb17fc650a
labelのリファレンスとサンプル
<label>: ラベル要素 - HTML: ハイパーテキストマークアップ言語 | MDN
https://developer.mozilla.org/ja/docs/Web/HTML/Element/label
<label>タグ:HTMLの使い方とサンプルコード集 - ウェブランサー
https://weblan3.com/html/label
labelタグの使い方 - HTMLリファレンス
https://catnose.me/learning/html/label
サンプルファイル
てす.html(UTF-8)
<html>
<head>
<title>てす</title>
</head><body>
<p>
<input type="checkbox" id="check1">
<label for="check1">同意する</label>
<p>
<label for="check2">同意する</label>
<input type="checkbox" id="check2">
<p>
<label for="check3">
<input type="checkbox" id="check3">同意する
</label>
<p>
<label for="check4">
同意する<input type="checkbox" id="check4">
</label>
<p>
<label>
<input type="checkbox" id="check5">同意する
</label><p>
</body>
</html>
Consoleのレスポンス
$x('//label[@for="check1"]')[0].textContent
'同意する'
$x('//label[@for="check2"]')[0].textContent
'同意する'
$x('//label[@for="check3"]')[0].textContent
'\n 同意する\n'
$x('//label[@for="check4"]')[0].textContent
'\n 同意する\n'
$x('//label[@for="check5"]')[0].textContent
ヒットなし→ 改行コード付きになっちゃう、、
$x('//label[@for="check1"]')[0].innerText
'同意する'
$x('//label[@for="check2"]')[0].innerText
'同意する'
$x('//label[@for="check3"]')[0].innerText
'同意する'
$x('//label[@for="check4"]')[0].innerText
'同意する'
$x('//label[@for="check5"]')[0].innerText
ヒットなし→innerTextが良さげ
$x('//label')[0].innerText
'同意する'
$x('//label')[1].innerText
'同意する'
$x('//label')[2].innerText
'同意する'
$x('//label')[3].innerText
'同意する'
$x('//label')[4].innerText
'同意する'→ check5の同意するもゲット