在爬取抖音的時候,由於抖音序列化使用的是protobuf,反序列化后,中文顯示的是八進制字符串,需要將八進制轉化為中文。網上找了好久,沒有找到現成的方法,就自己寫了一個比較笨的方法。
一、思路
源字符串是夾雜着八進制字符串和英文字母的字符串,如:
"
ssssssssssssssssfffffffffffffffffffffddddddddddddddddddsssssssssssss\\229\\156\\168\\233\\169\\190sdfsafsasfsddddddddddddd
"
以上只是示例,實際上,字符串會很會長。
而三個八進制字符串代表一個中文字符。所以,我們要先用正則表達式將八進制字符串匹配出來,三個為一組。
然后將這三個八進制字符串轉換為漢字,再將其替換到原文之中。(re.sub())
二、那么如何將三個八進制字符串轉換為數字呢?
思路是將八進制轉換為十進制數字,然后利用bytes將十進制數轉換為byte,最后再decode('utf8')即可。
bytes有一個方法,將一個10進制的列表轉換為一個漢字:
即:
bytes([232, 174, 176])
如:
\\229\\156\\168
上面是三個八進制字符串
ls = value.split('\\')[1:] #將8進制字符串分開,放入列表 ls = [int(i,8) for i in ls] #將8進制轉為10進制 try: return bytes(ls).decode('utf8') #將10進制的列表直接轉為一個漢字 except UnicodeDecodeError: #如果出現編碼錯誤(即不存在該編碼),則返回“!錯!” return '!錯!'
三、代碼
import re def sub_str(value): ls = value.group().split('\\')[1:] ls = [int(i,8) for i in ls] print(ls) try: return bytes(ls).decode('utf8') except UnicodeDecodeError: return '!錯!' text = re.sub(r'(?:\\\d{3}){3}', sub_str, text) #sub為替換,可以使用函數。 sub的使用:請參見: https://blog.csdn.net/qq_27061049/article/details/90708624
以上即可以將穿插在英文中的八進制字符串轉化為中文,並用中文替換該八進制字符串。
如果大家有簡便的方法,煩請告知。