Ruby で HTML の特定ノードのソース上の位置が知りたい
解決したいこと
HTML が与えられ,その中の特定のノードを CSS パスや XPath で探し出し,当該箇所の位置を知るにはどうすればいいでしょうか。
例えば以下のような HTML があるとします。
<!-- 前略 -->
<ul>
<li>foo</li>
<li class="hoge">bar</li>
</ul><!-- 後略 -->
このような HTML において,クラス hoge
を持つ要素,つまり,
<li class="hoge">bar</li>
が,HTML テキスト上で何文字目から何文字目まで占めているか,といったことが知りたいのです。
なお,「ノード」と書きましたが,想定しているユースケースではほぼ確実に要素なので「要素」と読み替えていただいても大丈夫です。
目的
HTML テキストに対し,文字列ベースでの加工を施したいのですが,加工箇所を HTML パーサーで絞りたいのです。正規表現で絞るのは極めて困難(現実には不可能)なので。
検討したこと
HTML のパーサーとして Nokogiri を用い,Nokogiri::HTML::Document の css
メソッドや xpath
メソッドで要素を得るのは簡単にできます。
しかし,得たノードは,「HTML テキスト上でどの位置を占めていたか」という情報を持っていないようです。
ドキュメントを見たのですが,そういう情報が取り出せそうなメソッドが見当たりませんでした。
Nokogiri の他には Oga というパーサーを検討しましたが,やはりそのようなメソッドは見つけられませんでした。
次に考えたのが,特定したノードの HTML 表現を使って検索をかけることでした。
しかし,Nokogiri のノードは,元の HTML を得る機能も持っていないようでした。
to_html
メソッドはありますが,これは HTML を再構築する機能であり,元と同じものが再現できるとは限りません。
たとえば,
<img src="foo.png"
class='bar'>
は
<img src="foo.png" class="bar">
にされてしまいます。