不動産屋のラノベ読み

不動産売買営業だけどガチガチの賃貸派の人のブログ

jQueryでスクレイピングする時の文字化け対処法

 
 id:IkeTさんがUbiquityスクレイピング的な事を試してまして、参考にさせていただいていました。
 で、エキサイト翻訳で文字化けする件があって、対処されていたのですが。
 

teramakoさんのご指摘を受けてjQuery.get(url, data, callback)→XMLHttpRequestに変更し、overrideMimeTypeに"text/html; charset=Shift_JIS"を指定したところ、文字化けなく表示できました。

jQuery.ajax(options)への変更も検討してみましたが、内部ロジックでoverrideMimeTypeを指定する箇所が無かったため、使用できませんでした。

UbiquityでHTMLコンテンツとマッシュアップ - IkeTの日記

 
 これ、jQueryでもできます。
 

Ajaxリクエストが送信される前に実行するコールバック関数を登録します。

http://stacktrace.jp/jquery/api/ajax/ajaxsend(callback).html

 XMLHttpRequestオブジェクトが引数で渡されるので、コールバック関数でoverrideMimeTypeを上書きしちゃえばいいです。
 なので、excite_en_jaコマンドをjQueryを使って書き換えると以下のような感じです。*1
 

var excite_en_ja = "http://www.excite.co.jp/world/english/";
CmdUtils.CreateCommand({
    name: "test",
    takes: {"text to translate": noun_arb_text},
    description: "Translates from English to Japanese by Excite.",
    preview: function(pblock, directObject) {
      
      var Params = {
        before: directObject.text,
        wb_lp: "ENJA"
      };
      jQuery().ajaxSend(function(event, XMLHttpRequest, options){
        XMLHttpRequest.overrideMimeType("text/plain; charset=shift_jis");
      });
      jQuery.ajax({
        type: "GET",
        url: excite_en_ja,
        data: Params,
        dataType: "text",
        error: function() {
          displayMessage("NG");
        },
        success: function(res) {
            var document = context.focusedWindow.document;
            var dummy = document.createElement("div");
              jQuery(dummy).html(res);
              var textarea = jQuery(dummy).find("textarea");
              if(textarea) {
                  var previewContent = "";
                  textarea.each(function() {
                      if (this.name == "after") {
                          previewContent+="<p style='font-style:italic;color:lightgray;>";
                      } else {
                          previewContent+="<p>";
                      }
                      previewContent+=jQuery(this).text();
                      previewContent+="</p>";
                  });
                  jQuery(pblock).html(previewContent);
              }
        }
      });

    },
    execute: function(directObject) {
    }
});

 
 ただ、このoverrideMimeTypeはコマンドラインを閉じでも保持され続けるようで*2、なんか、他のコマンドに悪影響が出そうでなんというか気持ち悪いですね。
 

追記

jQuery.ajax で overrideMimeType する方法 - hogehoge @teramako
↑overrideMimeTypeを保持してるんじゃなくて、ajaxSendがイベントとして保持されているとのこと。言われてみれば、毎回コンストラクタ使ってるわけだから当然ですよね、お恥ずかしい。リンク先の方法が全然良いので、そちらを参照して下さい。

*1:一部機能省略してます

*2:だから、本当は何度も呼び出す必要も無いみたい