物欲購入目録日誌 写真館
スポンサーサイト
--.--.-- (--:--) スポンサー広告
Twitterでつぶやく
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
RubyのMechanizeとnokogiriで文字化けするならhpricotを使えばよいさ!!
2011.10.04 (01:16) プログラミングtrackback(0)comment(0)
Twitterでつぶやく
nori_pc.png


Rubyでクローラーのようなプログラムを作成しようと思ったときにすごく便利なライブラリにMechanizeというものがあるのですが、、このmechanizeを用いるとメタタグに文字エンコーディングが記述されていないような一部の日本語のページで文字化けが発生する場合があります。

この事象は下記のページに詳しく記述されているのですが、

RubyのMechanizeで文字化けするページがある件について
http://insideflag.blogspot.com/2010/06/rubymechanize.html

どうもMechanizeのエンコーディングの決定方法と内部パーサーのNokogiri(libxml2)の問題で結構根が深いようでした。

いろいろ試してみたのですが、どうも上手くいかなくて前に作っていたプログラムはHTMLパーサーをhpricotに変更して回避していました。(hpricotは文字化けしない)

んで早速、同じようにhpricotに変更しようとソースなどを修正していると、どうもうまくいかない?

前のコードでは動いたのに、最新のMechanizeではデフォルトのHTMLパーサーをhpricotに変更できていないみたい。

前に動いていたMechanizeのバージョンが0.9で今最新版は2.0.1なので設定方法に問題があるのかといろいろやった結果。

すごくシンプルに以下のようにするとでけた。


--
#! /usr/bin/ruby
# -*- coding: utf-8 -*-
#
# Mechanizeでhpricotを使う
#
$KCODE = 'u'
require 'rubygems'
require 'mechanize'
require 'hpricot'
require 'kconv'

# サンプル
def main()
# URL
url = 'http://blog.livedoor.jp/geek/'

# agentを初期化
agent = Mechanize.new

# URLに接続
page = agent.get(url)

# pageオブジェクトをHpricotに渡してパーズする
doc = Hpricot(page.body)

# タイトルを表示
puts (doc/"title")[0].inner_html.toutf8
end # main

# main 関数
if __FILE__ == $0
main()
end
--
$ ./ex.rb
アキバBlog(秋葉原ブログ)


なんかすごい小難しいことを考えていたけど、、単純にpageオブジェクトをHpricotに渡せばいいだけ。

なんか、ドアの鍵とかいろんな手段でなんとか開けようと努力していたんだけど、、結局、ドアの鍵があいていて正面から入れたような気分。

とりあえず、これでも日本語のページも文字化けせずに取得できるようになったぉ。
prevhome next












トラックバックURL
→http://tachiphoto.blog61.fc2.com/tb.php/1479-8ca4e0c8
home
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。