cheerio 跳脫 html 的問題

cheerio 是在 node.js 上模仿 jquery 風格 操作 html 文件的函式庫。 但他在跳脫 html entities 上有些問題, 會將所有非 ascii 字元跳脫,在 xml 的行為也不同; 設成不跳脫又會讓大小於不正常。

用 cheerio 的時候如果不設 decodeEntities: false , 就會把非 ascii 都跳脫為  的形式, 中文就會無法閱讀。

但 decode entities false 會將 &gt; &lt; &amp; 也解碼回 > < & , 不論是用 .text().html()

在 jquery 或 dom 中,text 和 html 是不同的。 a.textContent = '<&>' 會變成 <a>&lt;&amp;&gt;</a>a.innerHTML = '<&>' 才是 <a><&></a> 並語法錯誤。 因為指定 text 時會自動跳脫。 指定到 html 時,也只會跳脫一次, a.innerHTML = '&gt;' 就是 <a>&gt;</a>

但 cheerio 指定 decode entities false 後, 會統一都還原回原字元。 $a.html('&amp;') 變成 <a>&</a>$a.text('>') 變成 <a>></a>

我有開 issue 問 cheerio 開發, 但他們說不是 bug, 只是因為我指定 decode entities false。

我記得以前的版本不會, 就去找以前在舊 debian 硬碟裡裝的 cheerio, 果然是正常的,那時候是 0.22.0 , 現在是 1.0.0-rc.2 ,只好暫時用以前的。

但以前的版本在 xml 裡,一樣 decode false, $a.text('1 > 2') 會變 <a>1 > 2</a> , 一樣要手動跳脫。

現在部落格系統暫時舊的 cheerio 頂著用, xml 自己跳脫,之後可能改用 jsdom 吧, 雖然有點大材小用的感覺,或者直接用 parser。