2009-05-06 3 views
3

コードを考慮:なぜNOSCRIPTの中からhtmlentitiesが返ってくるのですか?

<noscript><div>FOO</div></noscript> 

$('noscript').html(); 

戻り&lt;div&gt;FOO&lt;/div&gt;

を実行しているが、

$('noscript').text(); 

を実行するには、生のHTMLを返します。

これは私が予想していたものの逆です。これについての説明はありますか?

+0

私が覚えている限り、text()を使用してもHTMLタグは返されません。 – alex

答えて

3

jQueryの癖よりもDOMの癖のこのよりは:this answerが説明するように

$("<noscript><div>FOO</div></noscript>")[0].innerHTML == "&lt;div&gt;FOO&lt;/div&gt;" 

$("<noscript><div>FOO</div></noscript>")[0].textContent == "<div>FOO</div>" 

は基本的には、このアクションの動作は、一貫性がありません。

0

これは、htmlentitiesが破棄されるため、これは完全に矛盾しています。 &コピーは常にBOTH機能の著作権文字に変換されます。基本的には、変換を行っていなくても、そのままHTMLを抽出する関数が存在するはずです。

5

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; 
} 
+0

私はこの問題を解決するためにregexを使用することを支持しているかどうかはわかりません。私にCheerioのような良いHTMLパーサーが良い選択かもしれないと思う。 – FrankieTheKneeMan

関連する問題