想学网页抓取,新手Python的编码问题

2012-06-20 09:35:52 +08:00
 liuxurong
#-*-coding:utf-8-*-
#-*-encoding=utf-8
import cookielib, urllib2,urllib,sys
from bs4 import BeautifulSoup
response = urllib2.urlopen('http://www.baidu.com')
html = response.read()
soup = BeautifulSoup(html)


a=soup.prettify()

print a



UnicodeEncodeError: 'gbk' codec can't encode character u'\xa0' in position 3621: illegal multibyte sequence

搞不懂编码问题,请问怎么办.
30656 次点击
所在节点    Python
23 条回复
westy
2012-06-20 09:39:04 +08:00
百度的页面是GB2312编码的貌似。
yujnln
2012-06-20 09:44:20 +08:00
那就现学现用吧 /t/35062
hiwljun
2012-06-20 09:50:15 +08:00
试试用:
response = urllib2.urlopen('http://www.baidu.com').encode('gb2312')
liuxurong
2012-06-20 09:58:31 +08:00
@hiwljun 不行哟。
@yujnln 那个贴我看过了,搞了一个晚上,同呕吐,看来基础太差
yangg
2012-06-20 10:04:21 +08:00
html = response.read().decode('gb2312');
hiwljun
2012-06-20 10:06:43 +08:00
@yangg 哦,对,是.decode()
yangg
2012-06-20 10:07:49 +08:00
@hiwljun 还有read()之后 才decode啊
liuxurong
2012-06-20 10:09:37 +08:00
@yangg 还是不行...俺用windows..是这个原因吗?
alai
2012-06-20 10:39:15 +08:00
2009-04-15

关于抓取中文页面的一点小总结 - [python]
说起来简单,但也是经过好几个项目,来来回回出问题得出来的。

+最终转成UTF8输出是毋庸置疑的。
+抓的如果是中文页面的话,用GB18030来decode是比较正统的方法,gb2312是一个误区,其实我们的页面中使用的字符编码已经早就超出2312的那些了。
+明明是中文页面抓回来却没法用18030来decode的话,一般是因为页面中混杂了非法字符的原因,可以用ignore忽略掉非法字符。
alafeizai
2012-06-20 10:41:16 +08:00
ignore正解
liuxurong
2012-06-20 10:47:27 +08:00
UnicodeEncodeError: 'gbk' codec can't encode character '\xa9' in position 26408: illegal multibyte sequence
c
2012-06-20 10:59:16 +08:00
这年代了还用urllib2呀。 用requests吧,结果自动解码成unicode

>>> import requests
>>> r = requests.get('http://www.baidu.com')
>>> r.text
....
>>> type(r.text)
<type 'unicode'>
c
2012-06-20 11:01:30 +08:00
BF也过时了,用pyquery吧。

>>> from pyquery import PyQuery as pq
>>> html = pq(r.text)
>>> print html('title').text()
百度一下,你就知道
chairo
2012-06-20 11:29:07 +08:00
@c 直接libxml不就行了,为啥非套一层pyquery
tuoxie007
2012-06-20 11:55:49 +08:00
@c
@chairo 你们都很高级,我和LZ用的是同样的东西,哎,才发现自己这么土

@c 嗯,你们名字很高级

然后LZ那个应该改成这样,前面几楼说的都不能执行的,你们最起码自己试了再贴出来嘛=.=
html = response.read()
uhtml = unicode(html, "gbk")
soup = BeautifulSoup(uhtml)

另外,为什么我抓baidu的话,不需要自己转,soup自己就可以完成了,你是用的win?还是soup版本太低?
clowwindy
2012-06-20 12:14:00 +08:00
因为是 encode error,所以楼主是 print 的时候挂掉的,并且楼主一定在用简体中文 windows
解决方法就是改用 Cygwin,远离傻逼 windows 终端
ling0322
2012-06-20 12:29:01 +08:00
@chairo 貌似是有些网页不是标准xml格式的libxml不能解析, 但是pyquery容错性很强
INT21H
2012-06-20 12:33:02 +08:00
慢慢的就会发现BS的效率太低了,最后走上了re的不归路 =。=
ling0322
2012-06-20 12:44:22 +08:00
这个和控制台的编码(默认是GBK)有关吧, 在IDLE中运行没有问题
yangg
2012-06-20 14:18:11 +08:00
@INT21H 一直用re的路过,各种方便

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

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

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

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

© 2021 V2EX