cheerio 跳脫 html 的問題
cheerio 是在 node.js 上模仿 jquery 風格 操作 html 文件的函式庫。 但他在跳脫 html entities 上有些問題, 會將所有非 ascii 字元跳脫,在 xml 的行為也不同; 設成不跳脫又會讓大小於不正常。
用 cheerio 的時候如果不設 decodeEntities: false ,
就會把非 ascii 都跳脫為  的形式,
中文就會無法閱讀。
但 decode entities false 會將 > < &
也解碼回 > < & ,
不論是用 .text() 或 .html() 。
在 jquery 或 dom 中,text 和 html 是不同的。
a.textContent = '<&>' 會變成 <a><&></a> ,
a.innerHTML = '<&>' 才是 <a><&></a> 並語法錯誤。
因為指定 text 時會自動跳脫。
指定到 html 時,也只會跳脫一次,
a.innerHTML = '>' 就是 <a>></a> 。
但 cheerio 指定 decode entities false 後,
會統一都還原回原字元。
$a.html('&') 變成 <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。