Mechanize で興味深いエラーが発生しましたが、これをバグとして送信するか、回避策を探す必要があるかはわかりません。
(誤って?) 16 進コードでエスケープされた文字を含むページを開くと、ValueError が発生します。次のコードは、エラーを再現します。
import mechanize
b = mechanize.Browser()
gr = 'http://www.goodreads.com/'
b.open(gr + 'book/show/613791.Santuario_De_La_Pen_X303_A_De_Francia')
長いトレースバックの後、以下が報告されます。
File "C:\Python27\lib\site-packages\mechanize\_html.py", line 317, in unescape_charref
uc = unichr(int(name, base))
ValueError: invalid literal for int() with base 10: 'X303'
これは unescape_charref() がバイナリ文字コード (例: #771) を期待していることが原因だと思います。このページでは 16 進コード #X303 が使用されています。Mechanize にこれを適切に処理させる方法はありますか?
このようなページの head 要素内から URL を取得したいだけなので、この場合の適切なエスケープ解除についてはあまり気にしません。ValueError をキャッチして、応答を取得し続けたいと思います。残念ながら、Mechanize はこれに対処できず、None を返します。