0

※ 最下部にサンプル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>

 
ケース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内にあるラジオボタンオンの値を/

https://winactor.com/questions/?q=ラジオボタンオンの行のn列目のtextを取得したい

https://winactor.com/questions/?q=オンなのにチェック状態取得がFalseになる

  • スクリプトの工夫でひとまず切り抜けてきた経緯はある
  • 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の同意するもゲット

この質問は解決済みのためクローズされています。
anothersolution ベストアンサーとして選択しました
回答とコメントは、会員登録(無料)で閲覧できるようになります。