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

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

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

Python代码  收藏代码
  1. import urllib.request,urllib.parse,http.cookiejar
  2. cj=http.cookiejar.CookieJar()
  3. opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
  4. opener.addheaders=[(‘User-Agent’,‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)’)]
  5. urllib.request.install_opener(opener)
  6. m=urllib.request.urlopen(“http://qindongliang.iteye.com/blog/2142783”)
  7. print(m.read().decode(‘utf-8’))

控制台输出如下:

Java代码  收藏代码
  1. Traceback (most recent call last):
  2.   File “D:/pythonide/pythonprojectworkspace/python进阶/http学习/tt.py”, line 14, in <module>
  3.     print(m.read().decode(‘utf-8’))
  4. UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xe6 in position 626: invalid continuation byte
  5. Process finished with exit code 1

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

Java代码  收藏代码
  1. codecs.encode(obj, encoding=‘utf-8’, errors=‘strict’)
  2. Encodes obj using the codec registered for encoding.
  3. 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也提供了几种其他的错误模式:

序号 模式 说明
1 ‘strict’ 只要编码出现错误,就抛出异常
2 ‘replace’ 使用?等字符替换出现错误编码的地方
3 ‘ignore’ 忽略出现编码错误的地方,继续解码,并不会抛出任何异常
4 ‘xmlcharrefreplace’ 用适当的xml字符标记出现问题的地方
5 ‘backslashreplace’ 使用反斜杠代替出异常字符
6 ‘surrogateescape’ 使用UPUA标记替代

现在我们加上ignore属性后,又可以正常解析了:

Comments are closed.