本文主要介紹部分爬蟲在遇到
%u5317%u4eac%u70e4%u9e2d
這種類似unicode編碼的str
類型數(shù)據(jù)時氛什,無法直接使用decode('unicode-escape')
方法來轉(zhuǎn)成中文的時候,一個轉(zhuǎn)碼的解決方案匪凉,以及這個方案的思路!
今天在爬一個網(wǎng)站的時候屉更,遇到了一個網(wǎng)站,它的一些數(shù)據(jù)是通過ajax加載進來的一段json洒缀,它的value部分的內(nèi)容是像下面這樣子的:
%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22table-main%22%3E%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%20class%3D%22table-column%22%3E%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctable%20class
9迕铡F奂健! 這是給人類閱讀的嗎萨脑?隐轩??
明顯不是2吃纭V俺怠!
不過這個自然是難不倒我們鹊杖,顯然是被urlencode轉(zhuǎn)碼了的嘛悴灵。因此通過urllib.parse.unquote便可以轉(zhuǎn)回人類可閱讀的形式了。
本以為這樣便可以輕松拿到數(shù)據(jù)骂蓖,結(jié)果一看后發(fā)現(xiàn)积瞒,還是圖樣圖森破了。因為它的中文部分是這樣的:
<td>%u5317%u4eac%u70e4%u9e2d</td>
WHAT 登下?茫孔??
這是存心為難我胖虎被芳?缰贝?
不過不用太緊張,根據(jù)我們的經(jīng)驗畔濒,也可以一眼就看出它是一段unicode編碼剩晴,只不過是將 \
反斜杠 被換成了 %
百分號。
那么問題來了侵状,我們?nèi)绾螌⒁粋€str
類型的%u5317%u4eac%u70e4%u9e2d
編碼赞弥,轉(zhuǎn)換成另一個str
類型的中文呢?
在大量查閱了度娘之后壹将,發(fā)現(xiàn)大部分的回答只是說如何將unicode編碼轉(zhuǎn)換成str嗤攻,然而這個并不能解決我們這里遇到的問題毛嫉。因為一段正常的unicode編碼诽俯,是可以直接被python解釋器給解釋的,并不需要我們做其他的操作承粤。例如:
In[2]:'\u5317\u4eac\u70e4\u9e2d'
Out[2]: '北京烤鴨'
在尋找直接將其轉(zhuǎn)換為中文的方法的道路上被堵死后暴区,萬般無奈,只好自己尋找一個解決方案辛臊。這里的解決思路記錄如下:
- 從開發(fā)者的角度出發(fā)仙粱,將一段中文轉(zhuǎn)成unicode編碼
In[3]: '北京烤鴨'.encode('unicode-escape')
Out[3]: b'\\u5317\\u4eac\\u70e4\\u9e2d'
- 轉(zhuǎn)換完成后的結(jié)果是一個bytes類型,我們將其轉(zhuǎn)換為str類型
In[4]: '北京烤鴨'.encode('unicode-escape').decode()
Out[4]: '\\u5317\\u4eac\\u70e4\\u9e2d'
- 再用
%
百分號替換\\
雙反斜杠后彻舰,就得到了被轉(zhuǎn)碼的unicode類型字符串了
In[4]: '北京烤鴨'.encode('unicode-escape').decode().replace('\\','%')
Out[4]: '%u5317%u4eac%u70e4%u9e2d'
amazing7ジ睢候味! 只需要3步,就實現(xiàn)了這個轉(zhuǎn)碼需求隔心,原來如此的簡單白群!
那么結(jié)果也就不言而喻了,只需要將這三步給逆向回去硬霍,也就可以將一段unicode類型的str轉(zhuǎn)換成中文了帜慢。
那么,開干吧唯卖!
In[5]: '%u5317%u4eac%u70e4%u9e2d'.replace('%','\\').encode().decode('unicode-escape')
Out[5]: '北京烤鴨'
所以粱玲,一個查了幾個小時度娘也沒有解決的問題,通過這簡單的幾步就可以解決了!!!