Gammo は pure Ruby な HTML パーサです。
- gammo | RubyGems.org
- namusyaka/gammo: A pure Ruby HTML5-compliant parser with CSS selector and XPath 1.0 traversal
参考: WHATWG Living StandardとHTMLパーサ - Qiita
本記事は、WHATWG Living Standardに準拠することを目的としたHTMLパーサである「gammo」の紹介を目的としている。
タイトルの通りです。以下の方法でできました、というメモです。
require "gammo"
def my_css(node, expr)
# ほぼ Gammo::CSSSelector#query_selector_all の実装を流用しただけ
Gammo::CSSSelector::Traverser.new(expr)
.evaluate(Gammo::CSSSelector::Context.new(node: node))
end
html = <<~HTML
<!DOCTYPE html>
<html>
<body>
<div id="div1">
<span>span 1</span>
</div>
<div id="div2">
<span>span 2</span>
</div>
</body>
</html>
HTML
doc = Gammo.new(html).parse
div2 = doc.css("#div2")[0]
p div2.class #=> Gammo::Node::Element
spans = my_css(div2, "span")
p spans.size #=> 1
p spans[0].inner_text #=> "span 2"
Gammo::Node::Element
をオープンクラスして include Gammo::CSSSelector
を追加する方法でも動きますが、モンキーパッチを避ける意味では上記の方法が無難かなと思いました。
バージョン
ruby 3.4.1
gammo 0.3.0
この記事を読んだ人は(ひょっとしたら)こちらも読んでいます