コードを考慮:なぜNOSCRIPTの中からhtmlentitiesが返ってくるのですか?
<noscript><div>FOO</div></noscript>
が
$('noscript').html();
戻り<div>FOO</div>
を実行しているが、
$('noscript').text();
を実行するには、生のHTMLを返します。
これは私が予想していたものの逆です。これについての説明はありますか?
コードを考慮:なぜNOSCRIPTの中からhtmlentitiesが返ってくるのですか?
<noscript><div>FOO</div></noscript>
が
$('noscript').html();
戻り<div>FOO</div>
を実行しているが、
$('noscript').text();
を実行するには、生のHTMLを返します。
これは私が予想していたものの逆です。これについての説明はありますか?
jQueryの癖よりもDOMの癖のこのよりは:this answerが説明するように
$("<noscript><div>FOO</div></noscript>")[0].innerHTML == "<div>FOO</div>"
$("<noscript><div>FOO</div></noscript>")[0].textContent == "<div>FOO</div>"
は基本的には、このアクションの動作は、一貫性がありません。
これは、htmlentitiesが破棄されるため、これは完全に矛盾しています。 &コピーは常にBOTH機能の著作権文字に変換されます。基本的には、変換を行っていなくても、そのままHTMLを抽出する関数が存在するはずです。
page.contentのnoscriptタグ内のエンティティをエスケープしていると思われるPhantomJSバグがあるようです。この関数は、正しい形式に戻します。 S objectは、npmjs.orgで入手可能な文字列パッケージのものです。
function fixNoScript(content) {
var noscript = /<\s*noscript\s*>([^<]+)<\s*\/\s*noscript\s*>/ig;
var matches = content.match(noscript);
for (var i = 0; match && i < matches.length; i++) {
var decoded = S(matches[i]).decodeHTMLEntities().s;
var index = content.indexOf(matches[i]);
content = content.substring(0, index) +
decoded +
content.substring(index + matches[i].length);
}
return content;
}
私はこの問題を解決するためにregexを使用することを支持しているかどうかはわかりません。私にCheerioのような良いHTMLパーサーが良い選択かもしれないと思う。 – FrankieTheKneeMan
私が覚えている限り、text()を使用してもHTMLタグは返されません。 – alex