本篇文章很短,只是作為一個小技巧分享
今天在分析某網站的時候,遇到一個神奇的編碼,如下
13555555555
不管我怎么搞都解碼不出來,查了下,說的是在 Node 層利用 cheerio 決議網頁時,輸出的中文內容都是以 &#x 開頭的一堆像亂碼一樣的東西,嘗試過各種編碼都無效,而且神奇的是,將這一堆“亂碼”保存成網頁后,通過瀏覽器打開又可以正常顯示,憑我多年的爬蟲分析經驗來看,這應該就是我要的東西,并不是隨機生成的,想了很久,我突然想起了一種html的頁碼表現形式,有沒有覺得很像那種html的特征碼,比如 空格就是 以上的資料,格式是是不是非常像
而且這種形式是numeric character reference,數字取值為目標字符的 Unicode code point;以「&#」開頭的后接十進制數字,「&#x」開頭的后接十六進制數字,
從 HTML4 開始,numeric character reference 以 Unicode 為準,與檔案編碼無關,
我突然想起,之前遇到過一個網站,他的資料就是這樣的,用lxml庫里的fromtring就可以決議出來
于是:

from lxml.html import fromstring
s = '13555555555'
print(fromstring(s).text)
'13555555555'
后面發現,其實還有一種方法可以解決:

s = '13555555555'
k = s.replace(';', '').replace('&#x', r'\u00').encode('utf-8').decode('unicode-escape')
pirnt(k)
# '13555555555'
unicode-escape和unicode是同級別的一種字符集,但是很少用,針對一些特殊情況時會用,其實還有string-escape,其實這兩個我搜了下資料,感覺看了跟沒看一樣,我寫這個博客的5分鐘以前看了的,我現在都忘了說的啥了,反正說白了就是在決議一些資料無法正常決議時,就可以使用unicode-escape
然后還有一種更簡單的轉碼:
import html
s='13555555555' k = html.unescape(s) print(k) # '13555555555'
順便一說,在決議時的編碼,如果utf-8,gbk,gb2312都無法決議,可以用gb18030解碼
字符和&#xx互轉:
1.str轉&#xx:
k = 'test123123'
result = ''
for c in k:
result+="&#x"+"{:x}".format(ord(c))+";"
print(result)
# 'test123123'
2.&#xx轉str:
(因為博客園這個編輯器會自動解碼,所以截圖了)
1):

2):

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/150708.html
標籤:Python
上一篇:strip()的正則運算式版本
