at backyard

Color my life with the chaos of trouble.

Denoでfetchを用いてEUC-JPのサイトをスクレイピングするときのサンプル

Denoを使ってスクレイピングする処理を書いていた際に、データ取得元のサイトがEUC-JPだったため文字化けを起こしていました。

Denoを使っている場合、こういうケースはどうすれば良いのか調べたので備忘録として残しておくことにします。
(というか、Deno特有の処理は入っていないので、おそらくJavaScriptを利用したケースでもこのやり方は通用すると思います。)

なお、下記の記事を大いに参考にさせていただいています。感謝。

qiita.com

fetchを用いてEUC-JPのサイトをスクレイピングするときのサンプル

まずは下記のようにblobデータをEUC-JPで読み込むための関数を用意しています。
fetchする処理に一緒に書いてしまっても良いかもしれませんが、見た目をスッキリさせたかったので別関数として予め定義しています。
(TypeScriptのコンパイラーに怒られているので、@ts-ignore つけています。これは単なる私の怠慢です)

// @ts-ignore
function readEUC(blob) {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.onload = () => {
      resolve(reader.result);
    };
    reader.readAsText(blob, "euc-jp");
  });
}

あとは下記のようにfetchで取得したblobをこの関数に渡してやるだけです。
これで文字化けしていないHTMLを取得することができました。

const url = "<取得URL>";
const response = await fetch(url);
const blob = await response.blob();
const html = await readEUC(blob);