こんにちは。エンジニアのAraoです。今回は、Webスクレイピングで役に立つ、Nokogiriの拡張Rubygemを紹介します。これまた随分と間が空いてしまいましたが、スクレイピングでNokogiri HTMLパース時に、tableを転置するメソッドの紹介の続きになります。

Nokogiri拡張Rubygem、その名もTonkachi

弊社では、WebページのHTMLから必要な情報を取り出すのに、NokogiriというRubygemを使っています。そのNokogiriに関連して、あったら良いなと思う汎用的なメソッドを、TonkachiというRubygemとして公開しました。

ネーミングについては、ノコギリと来たらトンカチだろう、という、割といい加減な理由です。

提供する機能とそのサンプル

tonkachi | RubyGems.org

こちらが今回公開したTonkachiのRubygemページです。見ての通り、Nokogiriに依存しています。

sample_tonkachi: sample script for tonkachi

そしてこちらが、Tonkachiで提供する4メソッドのサンプルスクリプトです。実行方法は以下の通りです。

$ bundle install
$ bundle exec ruby sample.rb

提供する4メソッドについて解説します。

free_rowspan_colspan(table_node)

Nokogiriのテーブルノードを対象に、rowspan、colspanで結合されたセルを分割するメソッドです。セル結合の設定が変で、セルの欠損がある部分があった場合、そのセルを空白セルで補う機能も付いています。変換前後で以下のような感じになります。

transpose_nokogiri_table(table_node)

Nokogiriのテーブルノードを転置するメソッドです。前回記事で紹介したメソッドそのままになります。変換前後で以下のような感じになります。全く別のテーブルノードを返しているため、テーブルタグの属性などは全て失われます。必要な場合は補ってください。

get_nodes(node)

対象のノード以下のノードを再帰的に辿り、順序関係を維持した配列を返すメソッドです。階層構造ではなく順序関係が必要な場面で使います。こちらは文章での説明が難しいため、実際にサンプルスクリプトを実行してみてください。

get_css_path(node)

対象のノードの、id、class情報付きのCSSパスを取得するメソッドです。以下のような形で、CSSパスを取得することができます。

html > body > h1#tonkachi > text()
html > body > div:nth-of-type(2).category > h3:nth-of-type(2).method

今後の予定

やや駆け足での紹介となってしまいましたが、ひとまずRubygemという形でNokogiri拡張メソッドを公開しました。今後は、さらなる機能追加、また我々以外のWebスクレイピングエンジニアが改修を加えられるよう、テストやドキュメント周りの整備を進めていきます。