在爬取抖音的时候,由于抖音序列化使用的是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
以上即可以将穿插在英文中的八进制字符串转化为中文,并用中文替换该八进制字符串。
如果大家有简便的方法,烦请告知。