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。