关于中文网页爬虫显示乱码的问题

2016-01-03 13:07:34 +08:00
 huamihu
大家好,我在爬去一个中文网页的时候碰到了乱码的问题,试了很久都没成功,请帮我看下问题出在哪里?


网址: http://www.duxieren.com/shanghaishuping/201511.shtml

编码: UTF-8

系统: windows 7

Python 版本: 3

目标: 爬取文章列表

症状:能爬取,但是 print 出来之后全乱码,, 也尝试了了加 encoding = GBK 之类的参数但是无效,

请帮我看看问题出在哪里,多谢了

代码如下

import requests, bs4
web = requests.get('http://www.duxieren.com/shanghaishuping/')
soup = bs4.BeautifulSoup(web.text,"html.parser")
page = soup.findAll('a',{'class':'archive_article'})
for i in page:
print(i.get_text())
4116 次点击
所在节点    Python
7 条回复
rudy1224
2016-01-03 13:27:26 +08:00
第二行和第三行之间插一句
web.encoding='utf8'
手动指定编码
huamihu
2016-01-03 15:16:56 +08:00
@rudy1224 谢谢,我去尝试一下
janeyuan
2016-01-03 18:04:16 +08:00
GBK 是 GB18030 的子集 也就是说 GBK 有些字符不能显示 推荐直接用 GB18030

soup = BeautifulSoup(response,from_encoding='GB18030')
links = soup.find_all("td")

for ins in links:
if ins.get_text()!=None:
fout.write("<td>%s</td>"% ins.get_text().decode('GB18030').strip())
ahxxm
2016-01-03 19:22:04 +08:00
requests.get().text 在 python2 里是 unicode , python3 里是 str (也是 unicode ), requests 会把网页内容(.content ,类型是 bytes)用 chardet 检测出的编码类型转换成 unicode ,然后给.text 这个 property 。

然而 windows 命令行的默认编码是 cp936 (好像是这么拼的),所以如果 chardet 抽风了, unicode 内容就不合理, print 时候就可能乱码或者报错,后者可能性更高一点。

有两个方法: 0 )你开个文件把爬到的东西写进去,完了用 sublime/notepad++之类的东西打开看看,能看就没错了; 1 )手动给 response.content 做 decode ,我这儿 win10+python3.4.2 , rsp.content.decode('utf-8') != rsp.text

print(web.content.decode('utf-8')),我这个 win10 能正确在 cmd 中打印网页里的中文
ahxxm
2016-01-03 19:23:10 +08:00
上面说得不太准,是.text 这个 property 会调用 chardet 检测并自作聪明地返回结果……
Allianzcortex
2016-01-03 21:09:57 +08:00
如果可以用 print 输出正确显示的话那么就是 unicode 编码格式的问题了,有不同的解决方法,最直接的就是用 decode 和 encode 对网页内容进行各种转换
huamihu
2016-01-07 23:37:34 +08:00
@ahxxm 非常感谢你的帮助,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/247941

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX