昨天,本菜鸡想摘取(爬 的美名)一些资料,代码如下
import requests
url = 'https://blog.csdn.net/jkx521/article/details/100714226'
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
}
req = requests.get(url=url, headers=headers).text
print(req)
本以为会一帆风顺,结果出乎意料,竟然报了个错
UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa0’ in position 18577: illegal multibyte sequence
说是编码格式 gbk 无法编码字符 ‘\xa0’(万恶的字符,哼(¬︿̫̿¬☆))
我想都没想,直接把请求改成了如下
req = requests.get(url=url, headers=headers).content.decode('utf-8')
于是,我再次的本以为,以为万能的 utf-8 能够解救我的代码于苦海,但它竟然还报同样的错!什么鬼!
后来经过百度,查看别人的解决方法
-
有这样的
-
有这样的
-
还有这样的
-
而我的电脑就是那么的特殊,这些办法都不行
默默插一句,第三种方法可以输出了,但是都是乱码,如下图所示(部分结果)
最后,我想着,能不能把这些不能编码的字符给 干掉(替换掉) ,于是,怀着最后一丝希望,我做了如下的尝试
import requests
import re
url = 'https://blog.csdn.net/jkx521/article/details/100714226'
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
}
req = requests.get(url=url, headers=headers).content.decode('utf-8')
index = req.replace('\xa0;', '').replace('\xa9;', '').replace('\ufe0f;', '')
print(index)
结果还是报错,为什么呢?
我猜,可能是因为这个代码的逻辑是先编码,再替换,而在编码的时候就已经报错了,但又没有办法先替换,因为 replace 只能操作字符串,不能操作字节流。
正当我手足无措的时候,我突然看到了两个字母,伟大的字母,那就是—— re,我怎么把这个库给忘了啊,我兴冲冲地用 re 最终完成了我的目标
终极代码如下:
import requests
import re
url = 'https://blog.csdn.net/jkx521/article/details/100714226'
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
}
req = requests.get(url=url, headers=headers).content.decode('utf-8')
index = re.sub('\xa0;\xa9\ufe0f', '', req)
print(index)
终于成功了!!!
(部分结果如下)
留下一个小疑问,为什么 re 和 replace 都是要求操纵字符串,re 就可以替换字符,但 replace 就不行呢???欢迎各位大佬一起讨论这个问题。
以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。