首页 新闻 搜索 专区 学院

python爬一个百度之后中文爬完变成符号 是出什么问题

0
[待解决问题]

今天可以喝可乐吗的主页 今天可以喝可乐吗 | 菜鸟二级 | 园豆:202
提问于:2021-10-20 16:11
< >
分享
所有回答(2)
1

你猜对了一半, 编码

〆灬丶 | 园豆:1220 (小虾三级) | 2021-10-20 16:22

f.write(resp.read().decode("utf-8")) 是这句有问题吗 可以我看百度网页格式应该就是utf-8呀

支持(0) 反对(0) 今天可以喝可乐吗 | 园豆:202 (菜鸟二级) | 2021-10-20 16:24

@今天可以喝可乐吗:
我这边忙起来了,晚点再试试
你代码看起来没啥问题, 我建议你断点看看 write 的数据是不是转好了

支持(0) 反对(0) 〆灬丶 | 园豆:1220 (小虾三级) | 2021-10-20 17:03

@今天可以喝可乐吗:

import requests

url = 'https://www.baidu.com/'
res = requests.get(url)
print(res.encoding) # encoding='iso8859-1'

dir_path = "F:/vscode_pj/pj_test/thinks/"
file_path = dir_path + 'test.txt2'



# with open(file_path, 'w', encoding='utf-8') as f:
with open(file_path, 'w', encoding='iso8859-1') as f:
    f.write(res.text)
支持(1) 反对(0) 〆灬丶 | 园豆:1220 (小虾三级) | 2021-10-20 18:14

@韆: 不要误导小朋友

支持(0) 反对(0) 小小咸鱼YwY | 园豆:3191 (老鸟四级) | 2021-10-21 09:29

@小小咸鱼YwY:
我是运行后的回复, 你为啥先入为主?

支持(0) 反对(0) 〆灬丶 | 园豆:1220 (小虾三级) | 2021-10-21 09:53

@韆: .....这么初级的爬虫,我只不过偶尔上一下博客园而已

支持(0) 反对(0) 小小咸鱼YwY | 园豆:3191 (老鸟四级) | 2021-10-21 09:56

@小小咸鱼YwY:
我指的 “@韆: 不要误导小朋友” 这个;请问,我的回复哪里误导了
刚上传的运行截图(我不贴,不代表我没运行)
https://www.cnblogs.com/blame9/gallery/image/396280.html

支持(0) 反对(0) 〆灬丶 | 园豆:1220 (小虾三级) | 2021-10-21 10:02

@韆: 他页面是UTF8编码的,charset代表了页面编写,你这边代码逻辑就是相当于他原先utf8编码你把它解码成iso8859-1,已iso8859-1保存,本质解决方案是有问题的,应该先查看他页面是用什么编码,指定编码接码返回内容

支持(0) 反对(0) 小小咸鱼YwY | 园豆:3191 (老鸟四级) | 2021-10-21 10:24

@韆: 提问者表述意思是正确的,确实是utf8编码,你这样说容易误导提问者

支持(0) 反对(0) 小小咸鱼YwY | 园豆:3191 (老鸟四级) | 2021-10-21 10:26

@小小咸鱼YwY:
他的问题截图没有修改 response.encoding ;
你看看你截图的代码
对比运行下 response.encoding = "utf8" 注释前后 print(res.encoding) 的结果
说的怎么像 encoding='iso8859-1' 是我编造的

import requests

url = 'https://www.baidu.com/'
res = requests.get(url)
#res.encoding = "utf8"
print(res.encoding)
print(res.text)
支持(1) 反对(0) 〆灬丶 | 园豆:1220 (小虾三级) | 2021-10-21 10:48

@韆: 你知道requests模块是封装的方法的吗?他响应的encoding是requests作者通过返回值根据他的逻辑判定他的编码方式,而不是网页本身,requests作者对于响应的reponse中的encode判定本身就有问题,所有我们还是已人来判断,你也可以直接百度页面输入js,document.charset获取该页面的编码,也可以自己直接判断
= =,基础太弱了大兄弟,太依赖第三方模块了

支持(0) 反对(0) 小小咸鱼YwY | 园豆:3191 (老鸟四级) | 2021-10-21 13:46

@小小咸鱼YwY:
你说我基础薄弱,说我依赖第三方包我承认;
"@韆: 他页面是UTF8编码的,charset代表了页面编写,你这边代码逻辑就是相当于他原先utf8编码你把它解码成iso8859-1,已iso8859-1保存,本质解决方案是有问题的,应该先查看他页面是用什么编码,指定编码接码返回内容"
当你你回复我时,有看懂我的代码吗,

print(res.encoding) # encoding='iso8859-1'
with open(file_path, 'w', encoding='iso8859-1') as f:

我这就是先识别当前的编码,再做对应的处理(此处,我并没有看响应体,也没有排查 requests 的源码;就是按常规文字描述,将控制台输出,以注释的形式附在输出语句之后);

另外,如果你真的看了,我后面贴的连接,就会知道,我并不清楚包底层对 headers 的判断及处理,从而导致 response.text 按作者逻辑去调整编码
也不会发这一段文字 “@韆: 你知道requests模块是封装的方法的吗?他响应的encoding是requests作者通过返回值根据他的逻辑判定他的编码方式,而不是网页本身”

我不认同你  “requests作者对于响应的reponse中的encode判定本身就有问题”  的观点

别人的处理逻辑很清晰
The only time Requests will not guess the encoding is if no explicit charset is present in the HTTP headers and the Content-Type header contains text. In this situation, RFC 2616 specifies that the default charset must be ISO-8859-1. Requests follows the specification in this case. If you require a different encoding, you can manually set the Response.encoding property, or use the raw Response.content.

最后,希望你下次回复时 ,能直入主题,而不是用 “@韆: 不要误导小朋友” 这样一句话,误导我

支持(0) 反对(0) 〆灬丶 | 园豆:1220 (小虾三级) | 2021-10-21 14:23

@韆: 你可以指定Content-Type为utf8,我保证结果还不是utf8

支持(0) 反对(0) 小小咸鱼YwY | 园豆:3191 (老鸟四级) | 2021-10-21 14:54

@韆: requests模块有一堆问题,你深入了就很少用了

支持(0) 反对(0) 小小咸鱼YwY | 园豆:3191 (老鸟四级) | 2021-10-21 14:55

@韆: 不要听风就是雨,请先实践

支持(0) 反对(0) 小小咸鱼YwY | 园豆:3191 (老鸟四级) | 2021-10-21 14:56

@小小咸鱼YwY: 我改 content-type 干啥, 我打这么多字,只是为了搞清楚我误导啥了;剩下的你自己和提问的人聊吧,我又不是搞爬虫的

支持(0) 反对(0) 〆灬丶 | 园豆:1220 (小虾三级) | 2021-10-21 14:57
0

小小咸鱼YwY | 园豆:3191 (老鸟四级) | 2021-10-21 09:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册