ruby + mechanize 使ってみたたときの個人的なBK

個人的なBK。
そ れ p l a。きゃははruby+mechanizeでhtmlパースとか小学(ry。

1.firefox + firebug 使って xpathとるとハマる。
動的に要素を取得するので、サイトによってはdiv要素が多く取得されててハマる。
(といってもfc2.comでしかあったことない)
また、tableのtbodyタグを補完してくれるのでこれもハマる。
(これはたまにある)
対応としては、JavaScriptを切ることでまあまあ正常に要素を取得できる。

firebugはolタグなどの閉じるタグが必須で無い場合に続くタグを一段下の階層する。
mechanizeはそういうタグは無視する。
動作未確認だけどこんな感じのhtmlで発生したはず。

<html>
<body>
  <div>
    <span>
    <ol>
      <li>hoge</li>
    </span>
    <span>
      <li>fuga</li>
    </span>
  </div>
</body>
</html>

firebug:/html/body/div/span/ol/span/li
mechanize:/html/body/div/span/li
そういう書き方できるからしょうがないんだけど、対応したい場合には地道にxpathの最後尾を削っていって要素の取得状況から判断するのが早いと思う。
htmlがきれいなサービスならいきなりソース表示でもいいかもしれない。


2.meta タグ のcontent-type、もしくは http ヘッダのcontent-typeと本文の文字コードが違う性でハマる
本文がEUC-JPなのにmetaタグUTF-8って書いてあったり逆だったり。
対応としては、以下のような感じに。

require "rubygems"
gem "mechanize", "=1.0.0"
require "mechanize"
require "nkf"

agent = Mechanize.new
agent.get('http://localhost')
if NKF::UTF8 != NKF.guess(agent.page.body)
  agent.page.encoding = 'EUC-JP'
  agent.page.body = NKF.nkf("-e m0" agent.page.body) #これは不要かも
end

参考:http://d.hatena.ne.jp/kitamomonga/20100712/ruby_mechanize_loses_to_euc_html_tips

常識の範疇ですかそうですか。