关于\x开头的字符串编码转换中文解决方法

做爬虫可能经常遇到爬取到的数据存在编码问题,简直让人头疼,比如爬取到的是这样的:

例如:
\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c
中文是: 你好世界

上面这个是utf-8编码,但数据类型是字符串类型,而不是bytes类型的utf-8编码。

这样会导致一个结果:如果直接输出,显示的是乱码,也不能使用decode进行utf-8解码得到中文。

在python2中,中文指定utf-8格式,字符串存入内存就是utf-8编码格式,直接输出就是中文,就不存在这个问题;

而python3中,字符串存入内存是以unicode编码格式存入的,输出的是默认的utf-8编码格式,所以得到的是乱码。

可能有人会说,既然得到的是utf-8编码,在前面加上 " b " ,字符串就是bytes类型了,再利用decode进行解码不就可以得到中文吗?但显然,这是行不通的,你不可能去手动一个个添加,那有没有其他方法呢?

答案肯定是有的,既然知道这个字符串是utf-8编码的,那么我换种方式,只要将字符串中的 " \x " 改为 " % " 利用urllib中的unquote方法解码就可以得到中文了,因为url中的中文utf-8编码和这里的区别就是url中编码是%开头。

那么其实只要对utf-8字符串反向转换就行,先将字符串编码指定为unicode_escape

s = '\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c'
s = s.encode('unicode_escape')

得到bytes类型数据(单斜杠变成双斜杠)

b'\\xe4\\xbd\\xa0\\xe5\\xa5\\xbd\\xe4\\xb8\\x96\\xe7\\x95\\x8c'

接着再对bytes类型进行utf-8解码,得到字符串,将字符串中的 " \x " 替换为 " % "

ss = s.decode('utf-8').replace('\\x', '%')

替换作用就是将字符串改为url的utf-8编码格式

%e4%bd%a0%e5%a5%bd%e4%b8%96%e7%95%8c

最后利用urllib中的unquote方法将url编码解码,得到中文

un = parse.unquote(ss)

图1

  • 39
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Python字符串的常用方法及其描述如下: 1. capitalize():将字符串的第一个字符转换为大写,其他字符转换为小写。 2. casefold():将字符串中所有字符转换为小写。 3. center(width, fillchar):返回一个指定宽度的居中对齐的字符串,fillchar为填充字符,默认为空格。 4. count(sub[, start[, end]]):返回字符串中指定子字符串出现的次数,start和end表示子字符串的起始和结束位置。 5. encode(encoding='utf-8', errors='strict'):将字符串编码为指定编码格式的字节串。 6. endswith(suffix[, start[, end]]):判断字符串是否以指定的后缀结尾,start和end表示字符串的起始和结束位置。 7. expandtabs(tabsize=8):将字符串中的制表符替换为指定数量的空格,默认为8个空格。 8. find(sub[, start[, end]]):查找字符串中指定子字符串的位置,start和end表示子字符串的起始和结束位置。 9. format(*args, **kwargs):格式化字符串。 10. format_map(mapping):格式化字符串,mapping为字典类型。 11. index(sub[, start[, end]]):查找字符串中指定子字符串的位置,start和end表示子字符串的起始和结束位置,如果找不到子字符串,则会抛出异常。 12. isalnum():判断字符串是否由字母和数字组成。 13. isalpha():判断字符串是否只由字母组成。 14. isdecimal():判断字符串是否只由十进制数字组成。 15. isdigit():判断字符串是否只由数字组成。 16. isidentifier():判断字符串是否是一个合法的标识符。 17. islower():判断字符串是否只由小写字母组成。 18. isnumeric():判断字符串是否只由数字组成。 19. isprintable():判断字符串是否是可打印的。 20. isspace():判断字符串是否只由空格组成。 21. istitle():判断字符串是否符合标题规则,即每个单词的首字母都大写。 22. isupper():判断字符串是否只由大写字母组成。 23. join(iterable):将可迭代对象中的元素按照指定的分隔符连接成一个字符串。 24. ljust(width[, fillchar]):返回一个指定宽度的左对齐的字符串,fillchar为填充字符,默认为空格。 25. lower():将字符串中所有字符转换为小写。 26. lstrip([chars]):去除字符串左边的指定字符,默认为空格。 27. maketrans(x[, y[, z]]):返回一个字符映射的转换表,用于translate()方法。 28. partition(sep):将字符串以指定的分隔符分成三部分,返回一个元组,包含分隔符之前的部分、分隔符本身和分隔符之后的部分。 29. replace(old, new[, count]):将字符串中指定的子字符串替换为另一个字符串,count表示替换的次数。 30. rfind(sub[, start[, end]]):查找字符串中指定子字符串的位置,从右向左查找,start和end表示子字符串的起始和结束位置。 31. rindex(sub[, start[, end]]):查找字符串中指定子字符串的位置,从右向左查找,start和end表示子字符串的起始和结束位置,如果找不到子字符串,则会抛出异常。 32. rjust(width[, fillchar]):返回一个指定宽度的右对齐的字符串,fillchar为填充字符,默认为空格。 33. rpartition(sep):将字符串以指定的分隔符分成三部分,从右向左查找,返回一个元组,包含分隔符之前的部分、分隔符本身和分隔符之后的部分。 34. rstrip([chars]):去除字符串右边的指定字符,默认为空格。 35. split([sep[, maxsplit]]):将字符串按照指定的分隔符分成多个子字符串,maxsplit表示最多分割的次数。 36. splitlines([keepends]):将字符串按照换行符分成多个子字符串,keepends表示是否保留换行符。 37. startswith(prefix[, start[, end]]):判断字符串是否以指定的前缀开头,start和end表示字符串的起始和结束位置。 38. strip([chars]):去除字符串两端的指定字符,默认为空格。 39. swapcase():将字符串中的大小写字母互换。 40. title():将字符串转换为标题格式。 41. translate(table):根据给定的转换表,将字符串中的字符进行转换。 42. upper():将字符串中所有字符转换为大写。 43. zfill(width):返回一个指定宽度的右对齐的字符串,左边用0填充。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值