へぬもへメモ

https://twitter.com/henumohe

Webstemmerの文字コードが解決したと見せかけてしてなかったけど一応再度解決

前回の続き。タイトルがまどろっこしい。
extract.pyのオプションに'-c euc-jp'を入れて解決したと思いきや、日経の文字コードUTF-8で、今度はこちらが文字化けることが発覚。どうも文字コードを指定すること自体が問題らしい。
どうしたら良いか分からず、思いつきで文字コード指定をとっぱらってみた。

#extract.py
def main():
  ...
  (debug, pat_threshold, diffscore_threshold, mainscore_threshold, default_charset, codec_out, strict) \
          = (0, 0.8, 0.5, 50, '', 'utf-8', False)
       #  = (0, 0.8, 0.5, 50, 'iso-8859-1', 'utf-8', False)

文字コード指定が無いときはiso-8859-1でエンコードしていたらしい。本当に完全な思いつきで空白にしてみただけなのだが、これで直ってしまった。
元々HTMLパーサでmetaタグのcharsetから文字コードを取得していたのだけど、どうやらdefault_charsetのほうが優先されてしまってたみたい。

#htmlparser3.py
CHARSET_FIND = re.compile(r'charset\s*=\s*([^">;\s]+)', re.I)
def hook_charset(self, attrs):
  if ('http-equiv' in attrs) and ('content' in attrs):
    m = self.CHARSET_FIND.search(attrs['content'])
    if m:
      self.set_charset(m.group(1))
  elif 'charset' in attrs:
    self.set_charset(attrs['charset'])
  return

問題はmetaタグからcharsetを取得できなかった場合だが、とりあえず文字コード指定の無いHTMLを発見するまでは放置しておくことにした。
きっと次回へ続く。