Closed ikeyan closed 8 years ago
PRありがとうございます。
decodeEntitiesをfalseにしているのはちょっとした経緯がありまして、
以前はdecodeEntitiesの指定をしていなかったのですが(結果的にcheerioデフォルトのtrue
でパース)、それでパースした$
で.html()
メソッドを実行すると、全部の文字がエンティティ化された状態で返ってきてしまうことが分かりました。
※今回のikeyanさんのPRをマージした状態でexample/google.jsの28行目と30行目の.text()
を.html()
にするとそのようになっているのを確認できると思います。
なので、cheerioのdecodeEntitiesは求めているものと違う => decodeEntitiesをfalse
にした、という流れがあります。
その副作用として、元からエンティティで書かれている部分をcheerioのtext()
やhtml()
で取得するとエンティティのまま返ってきてしまうので、その対策として{text,html}のプロトタイプ拡張を仕込んでいる、といった感じです。
なので、今回のPRは一旦見送らせてもらいます。スミマセン:pensive:
それとは別で、{attr,data}などにエンティティが入っているとそのまま取得してしまうのは{text,html}と同じような対策が必要ですが、各メソッド毎にエンティティデコードをかます拡張を仕込むのも何かアレなので、こちらについてはちょっと検討させてください(cheerioでパースする前にbody
に対してエンティティデコードするとか、decodeEntitiesをtrue
にしておかしくなるのがhtml()
だけなら、decodeEntitiesをfalse
にするのはやめて.html()
のcheerio拡張は残しておく、とか)。
今まで、cheerio.loadに
{ decodeEntities: false }
をわたし、cheerio.prototype.{text, html}でHTMLエンティティをデコードしていたため、cheerio.prototype.{attr,data}などではHTMLエンティティがデコードされていませんでした。このPRでは、
client.loadOptions
を追加し、初期値を{ decodeEntities: true }
として、これをcheerio.load
に渡すようにしたため、cheerioの全メソッドでデコード済みの値が取得できるようになり、独自の {text, html} プロトタイプ拡張が不要になります。マージよろしくお願いします!