文字エンコーディング

またぞろきたももんがさん師匠の受け売りです。

http://d.hatena.ne.jp/kitamomonga/20081209/kaisetsu_for_ver_0_9_ruby_www_mechanize
http://jp.rubyist.net/magazine/?0009-BundledLibraries#l15

Mechanize は meta charset やレスポンス HTTP ヘッダの Content-Type を読むことで HTML の文字エンコーディングを推定しますが、うまくゆかないことが有ります。

inner_text の内容が読めなかったり、あるはずのリンクが存在しなかったりする場合は agent.page.parser.errors にエンコーディング関連のエラーが並びます(HTML構造関連のエラーも入ってるので間違えないようにしてください)。
Mechanize::Page#encoding= で「正しい」文字エンコーディング名を指定し、再パースを指示することができます。

agent.get(bad_uri)
agent.page.encoding = '正しい文字エンコーディング名'

推定に失敗する HTML はそのつくり自体が推定に向かない構造になってるので、小細工で推定させようとするのは諦めて素直に文字エンコーディングを指定してください。

以下、避けて通れないぐちゃぐちゃどろどろを文章にできなかったので一覧

libxml2 に直接渡されるので、libxml2 が内部で使う iconv がサポートしてる文字エンコーディング名のみ有効
非公式パッチがあたっていない iconv は Windows-31J が使えないので注意
Ruby 1.9.x の Encoding クラスはパース時にはまったく活用されません(Page#bodyを変換して使うことは可能)
拡張文字の有無は正確に処理されるので、一般的な Shift_JIS は CP932 か Windows-31J で指定
ウムラウトなどの「記号つきアルファベット」が入ってたら US-ASCII ではなく Latin-1 等
EUC-JP でダメなら CP51932 と eucJP-ms でどうだろう
Mechanize は HTML に meta charset が書いてあればそれをまず使う
meta charset がなければレスポンス HTTP ヘッダの Content-Type の charset を使う
それもなければ NKF.guess にかけた結果を使うがこれは Latin-X を判別できない
meta や Content-Type の charset が x-sjis 等の「iconvやencodeが知らない」値の場合は推定失敗
UTF-8/16/32 の HTML の場合は charset がなくても一発で通るよ!よ!
meta charset があってもそれより前に非 UTF-8 文字が書いてあると推定失敗(最新版Nokogiriでは自動フォロー可能)
パースに失敗している場合は agent.page.parser の返り値が HTML と似ても似つかないものに
agent.page.parser.errors の戻り値のほうが正確だが読みにくい