XPathで要素内のテキストでヒットした次の要素を取得

XPathを少しだけ触ったので備忘録。
正規表現みたいなものなんだね。いつかガッツリやりたい。

欲しい情報

MITテクノロジーレビューの「今日」のタイトルと記事URL。
f:id:hiro-29:20200121165606p:plain:w450

ソースはこんな感じ。
f:id:hiro-29:20200121165630p:plain

タグの中に「今日」と書いてあるだけなので、要素指定はできなさそう。

text() 指定で「今日」を指定し、後に続くリンクを「following-sibling::」で取得

完全一致

//*[@id="daily"]//span[text()='今日']/following-sibling::a[1]

部分一致

//*[@id="daily"]//span[contains(text(),'今日')]/following-sibling::a[1]
  • 冒頭の @id=は、無くてもおそらく行けるのだが、無いと時間かかる
  • 要素の中身のテキストを検索したい場合は、[contains(text(),'文字列')] で行けるらしい
  • 冒頭だけでなく、途中の要素をすっ飛ばすというのも「//」でイケる
  • 「次の要素」を指定できる「following-sibling::」

参照させていただいた記事はコチラ↓

●キャプチャがめっちゃ分かりやすい良雰囲気記事
クローラ作成に必須!XPATHの記法まとめ - Qiita

●「あれどうやるんだっけ」と見たくなるシンプル記事
HTML情報を取得する Xpath を覚えよう – Cloud Cafe

複雑な指定するにはもっとちゃんと勉強しなくちゃと思うけど、雰囲気は掴めた気がします。

NG集

最初、Qiitaの記事をそのままコピペして「contains(*,'今日')」と書いてダメだった…。
アスタリスク指定「*」が効かなかったっぽいのですよね。
もしくはすっごく時間がかかってタイムアウトしていたか。

動かしてる環境のせいなのか、表記自体がおかしいのかはまだ調べてないんですが、Qiitaの元記事はテーブル要素なので、もしかしてテーブルだと動きが違う??のかな。
HTML的に別要素? テーブルってちょっと特殊でしたよね。

また後日、ちゃんとリファレンス読み込んでみたいなー。