Python3.4网页抓取之编码异常

[b][color=green][size=large]使用Python抓取网页的时候,有时候我们会解析出现异常,这时候,就会导致整个网页解析不成功,究其原因,仅仅是因为编码里某个小小的地方编码出错了,才导致解析失败,那么我们应该如何比较好的避免这种情况出现呢?
看下面的例子:
[/size][/color][/b]

import urllib.request,urllib.parse,http.cookiejar


cj=http.cookiejar.CookieJar()
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
opener.addheaders=[('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')]

urllib.request.install_opener(opener)

m=urllib.request.urlopen("http://qindongliang.iteye.com/blog/2142783")


print(m.read().decode('utf-8'))

[b][color=olive][size=large]控制台输出如下:[/size][/color][/b]
Traceback (most recent call last):
File "D:/pythonide/pythonprojectworkspace/python进阶/http学习/tt.py", line 14, in <module>
print(m.read().decode('utf-8'))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe6 in position 626: invalid continuation byte

Process finished with exit code 1


[b][color=green][size=large]当然,我们抓取其他的网页,可能没有这个异常,但是由于某些编码的内容有一些小小的问题,所以导致了上述异常的发生,可以看出是在decode解码时发生的异常,下面我们就看下decode方法的支持的模式,来自python的API文档里面有这样一段话:
[/size][/color][/b]

codecs.encode(obj, encoding='utf-8', errors='strict') 
Encodes obj using the codec registered for encoding.

Errors may be given to set the desired error handling scheme. The default error handler is strict meaning that encoding errors raise ValueError (or a more codec specific subclass, such as UnicodeEncodeError). Refer to Codec Base Classes for more information on codec error handling.


python默认的解码对待错误的方式是严格执行的,有一点小小错误,就会整个解析失败,当然python也提供了几种其他的错误模式:
[b][color=olive][size=large][table]
|序号|模式|说明
|1|'strict'|只要编码出现错误,就抛出异常
|2|'replace'|使用?等字符替换出现错误编码的地方
|3|'ignore'|忽略出现编码错误的地方,继续解码,并不会抛出任何异常
|4|'xmlcharrefreplace'|用适当的xml字符标记出现问题的地方
|5|'backslashreplace'|使用反斜杠代替出异常字符
|6|'surrogateescape'|使用UPUA标记替代

[/table][/size][/color][/b]

[b][color=green][size=large]现在我们加上ignore属性后,又可以正常解析了:[/size][/color][/b]


[img]http://dl2.iteye.com/upload/attachment/0102/0078/7a985e25-77c4-363e-b07e-6ae4a68d20d2.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值