ワテのブログ

The fundamental things apply As time goes by.

2017年9月13日水曜日

Nokogiriでhtmlをパースする

スポンサーリンク

Nokogiriをインストール

$ gem install nokogiri

macos Sierra の場合ビルド中にエラーが発生する。
以下のコマンドで回避可能。

$ gem install nokogiri -- --use-system-libraries=true --with-xml2-include=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/libxml2

Nokogiriを試してみる

here documentでhtmlを変数に代入。
htmlをNokogiriでパースしてdocを作成した後、docをhtmlとして出力する。

# -*- encoding:utf-8 -*-
require 'rubygems'
require 'nokogiri'

html = <<'EOS'
<!doctype html>
<html>
<body>
<a name="hoge" />
<td/>
<img src="hoge.png" />
</body>
</html>
EOS

doc = Nokogiri::HTML(html)

puts doc.to_html

雑なhtmlを入力してもなにかしら訂正されて出力される。
これはparse optionで制御可能である。

parse optionには以下のものがある。

  • NONET => 解析中にネットワーク接続を防止します。 信頼できないドキュメントの解析に推奨されます。(デフォルト)
  • RECOVER => エラーからの回復を試みます。 不正な形式または無効な形式の文書の解析に推奨されます。(デフォルト)
  • NOBLANKS => 空のノードを削除する。
  • NOENT => エンティティを置換する。
  • NOERROR => エラー報告を抑制する。
  • STRICT => 厳密な解析。 不正な形式の文書を解析するときにエラーが発生する。
  • DTDLOAD and DTDVALID => DTD検証が必要な場合。
  • HUGE => ドキュメントのサイズやDOMの深さに関するハードコードされた制限をスキップするのに使用します。 パフォーマンスのペナルティが付いてくる

これらのオプションを使うには

doc = Nokogiri::HTML(html) do |config|
  config.options = Nokogiri::XML::ParseOptions::STRICT | Nokogiri::XML::ParseOptions::NOBLANKS
end

という風に設定する。

実例集

タグの種類を変更する。
例えば<b>を<strong>に変更する。

doc.search('//b').each do |node|
    node.name = 'strong'
end

print doc.to_html

属性値を変更する。

doc.search('//a[@name]').each do |node|
    node['id'] = node['name']
    node.attributes['name'].remove
end

print doc.to_html
スポンサーリンク