关于python3.x版本 urllib修改过后遇到的几个问题

来源:互联网 发布:二手交易软件有什么 编辑:程序博客网 时间:2024/06/05 03:39

urllib 文档描述

因为特意在使用python3.x版本,所以在学习爬虫的时候经常会用到一些网上2.x版本的代码,总是报错,就很尴尬。这里列出一些已经遇到的问题,之后在遇到其他的还会有补充。
先引用官方文档列出一下python3.x 版本中urllib各部分的功能:

urllib is a package that collects several modules for working with URLs:

  1. urllib.request for opening and reading URLs 打开和阅读
  2. urllib.error containing the exceptions raised by urllib.request 包含意外和错误
  3. urllib.parse for parsing URLs 解析
  4. urllib.robotparser for parsing robots.txt files 解析robots.txt文件
    直译大概是这样:(
    文档连接

urlopen

首先就是urlopen,在2.x版本中,urlopen的使用方法如下:

import urllib2url = 'http://www.abc.com'response = urllib2.urlopen(url)

而在python3.x中urllib 和 urllib2 合并了。那么,这样说来应该写作:

import urlliburl ='http://www.abc.com'response = urllib.urlopen(url)

但是,事实上会报出如下错误:

module ‘urllib’ has no attribute ‘urlopen’

因为urlopen并不在urllib模块中,而是被移动到了urllib.request中。这跟前面所提到的文档中写的是一致的,urllib.request是要用来打开和阅读连接。
这里必须要说明:

import urlliburllib.request.urlopen()

报错(原因待查):

AttributeError: module ‘urllib’ has no attribute ‘request’

正确的做法是在import的时候必须注明:

import urllib.request

所以正确的代码段落如下所示:

import urllib.requesturl = 'http://www.abc.com'response = urllib.request.urlopen(url)

urlencode

在python2.x中urlencode的用法如下:

import urlliburl='http://www.abc.com'values = {}values['username']='abc'values['password']='abc'data = urllib.urlencode(values)

在python3.x中报错信息如下:

AttributeError: module ‘urllib’ has no attribute ‘urlencode’

在前面的介绍中写到urllib.parse是用来做url解析的,所以在这里urlencoding被移入了urllib.parse中。正确的写法为:

import urllibvalues={}values['username']='abc'values['password']='abc'data = urllib.parse.urlencode(values)

另外在抓取的时候经常会有人出现乱码的现象,除了常规文件头要加的那几个系统默认编码调整以外,在request.read()后面一定要加一个decode这样才能够正常显示中文。