質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

4565閲覧

[Node.js]cherrio-httpcliが文字化けする

yohira0616

総合スコア257

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/03/27 10:05

Webクローラーを作ろうと思ってcherrio-httpcliを使ってみたのですが、文字化けをして詰まりました。。。

環境:Mac OS X El Capitan
Node v5.7.0

package.json

javascript

1{ 2 "name": "node-crowler", 3 "version": "1.0.0", 4 "description": "", 5 "main": "index.js", 6 "scripts": { 7 "test": "echo \"Error: no test specified\" && exit 1" 8 }, 9 "author": "", 10 "license": "ISC", 11 "devDependencies": { 12 "buffer": "^4.5.0", 13 "cheerio-httpcli": "^0.6.5", 14 "gulp": "^3.9.1", 15 "gulp-typescript": "^2.12.1", 16 "iconv": "^2.1.11", 17 "request": "^2.69.0", 18 "tsd": "^0.6.5" 19 } 20} 21

getpage.js

javascript

1var client = require('cheerio-httpcli'); 2 3//yahooのトップページを取得する 4var url = "http://www.yahoo.co.jp"; 5 6client.fetch(url, function (err, $, res) { 7 var body = $.html(); 8 console.log(body); 9});

以下のコマンドにより実行

$ node src/getpage.js > result

resultを見ると、日本語の部分が

html

1<h2>&#x30E4;&#x30D5;&#x30FC;&#x304B;&#x3089;&#x306E;&#x304A;&#x77E5;&#x3089;&#x305B;</h2>

のように文字化けしている。

調べてみたところ、特に設定をしなくてもライブラリ側でよろしく文字コードを処理してくれるのがcherrio-httpcliらしいですが、私のPCではきっちり文字化けしてしまっています。。。

cherrio-httpcli#fetchの第二引数に"sjis"や"utf8"を指定しても解決しませんでした。
手詰まりになったので質問させていただきます。よろしくお願いしますm(__)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

文字化けではなく、数値文字参照として変換されてるようです
文字参照 - Wikipedia

JavaScript で日本語に戻すには、要素の innerHTML に入れて、 textContent を取得すればできると思いますが、Node.js ではこの方法は使えなそうです

npm を調べてみるとこのライブラリで変換できそうです
https://www.npmjs.com/package/he

cherrio-httpcli 自身に日本語で取得機能があるかはわからないですが、ぐぐってみると数値参照になることに愚痴を言ってる人をみかけたのでもしかすると、日本語のまま取得することはできないのかもです

投稿2016/03/27 12:47

ryls-nmm

総合スコア633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohira0616

2016/04/02 16:34

ありがとうございます。 he#encodeをかませると数値参照を日本語に切り替えることができました。 $({cssセレクタ})で要素を絞り込んで、出力するときにその要素に対してhe#encodeをかませれば任意の要素を日本語で取れそうですね。
guest

0

この現象は、cheerio.load()実行時に渡せる引数 option の decodeEntity を false にしてやることで変換を無効化して出力できるのですが…

どうも cheerio-httpcli は外側から cheerio.load() に対して option を渡せないようですね。

行われている事は平文をHTMLEntity文字列へ変換しているだけなので、出力結果に対してdecode処理をかけてやれば復元は可能だと思います。

html-entitiesのようなデコードできるライブラリを使ってみてはどうでしょうか。

投稿2016/03/30 14:46

Favi_ty

総合スコア42

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohira0616

2016/04/02 16:34

ありがとうございます。cherrioのほうも触ってみます。
guest

0

0.3.0以降だとcallbackの第4引数から元のbodyが取れるようになっているようです。

以下引用

jQueryっぽいオブジェクトじゃなくて素のhtmlが欲しいんだけど

$.html()で取得できます。
追記:$.html()はcheerioがパースしたDOMを再構築したもののようなので、厳密には元のHTMLとは異なります。バージョン0.3.0からfetch()のコールバック関数の第4引数に元のHTML(UTF-8に変換済み)をセッ>トするようにしました。

以下のような感じでとれるようになります。

javascript

1var client = require('cheerio-httpcli'); 2 3//yahooのトップページを取得する 4var url = "http://www.yahoo.co.jp"; 5 6client.fetch(url, function (err, $, res, body) { 7 console.log(body); 8});

参考資料

Node.js用のスクレイピングモジュール「cheerio-httpcli」の紹介

投稿2016/03/28 09:17

umed0025

総合スコア851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohira0616

2016/04/02 16:32

ありがとうございます。 第4引数の値をconsole.logで取ってみましたが、body要素が表示できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問