Python urllib库详解
在 Python 程序中,urllib 库可以处理客户端的请求和服务器端的响应,还可以解析 URL 地址,常用的模块为 request 和 parse。
要读取一个网页文件,可以使用 urlopen() 方法。其语法如下:
urlopen() 方法返回一个 stream 对象,可以使用 file 对象的方法来操作此 stream 对象。
下面的示例读取 http://www.baidu.com 的网页。
下面的示例显示刚才打开的 htmlpage 对象的 url 属性。
urllib 模块的方法如下:
1) urlretrieve(url [, filename [, reporthook [, data]]]):将一个网络对象 url 复制到本机文件 filename上。其中,参数 reporthook 是一个 hook 函数,在网络连接完成时会调用此 hook 函数一次,每读取一个区块也会调用此 hook 函数一次,参数 data 必须是 application/x-www-form-urlencoded 格式。例如:
2) urlcleanup():清除 urlretrieve() 方法所使用的高速缓存。
3) quote(string [, safe]):将字符串 string 中的特殊字符用 %xx 码取代。参数 safe 设置要引用的额外字符。例如:
4) quote_plus(string [, safe]):与 quote() 方法相同,但是空白将以加号(+)取代。
5) unquote(string):返回原始字符串。例如:
下面的示例将读取 http://www.python.org 主页的内容。
下面的示例将 http://www.python.org 网页存储到本机的 13.2.html 文件中。
parse 模块的方法如下:
1) urlparse(urlstring [, default_scheme [, allow_fragments]]):将一个 URL 字符串分解成 6 个元素,即 addressing scheme、netword location、path、parameters、query、fragment identifier。若设置参数 default_scheme,则指定 addressing scheme;若设置参数 allow_fragments 为 0,则不允许 fragment identifier。例如:
2) urlunparse(tuple):使用 tuple 创建一个 URL 字符串。例如:
3) urljoin(base, url [, allow_fragments]):使用 base 与 url 创建一个绝对 URL 地址。例如:
urllib request模块
request 模块使用 socket 读取网络数据的接口,支持 HTTP、FTP 及 gopher 等连接。要读取一个网页文件,可以使用 urlopen() 方法。其语法如下:
urllib.request.urlopen(url [, data])其中,参数 url 是一个 URL 字符串,参数 data 用来指定一个 GET 请求。
urlopen() 方法返回一个 stream 对象,可以使用 file 对象的方法来操作此 stream 对象。
下面的示例读取 http://www.baidu.com 的网页。
import urllib from urllib import request htmlpage = urllib.request.urlopen("http://www.baidu.com") htmlpage.read()urlopen() 方法返回的 stream 对象有两个属性,即 url 与 headers。url 属性是设置的 URL 字符串值;headers 属性是一个字典集,包含网页的表头。
下面的示例显示刚才打开的 htmlpage 对象的 url 属性。
htmlpage.url 'http://www.baidu.com'下面的示例显示刚才打开的 htmlpage 对象的 headers 属性。
for key, value in htmlpage.headers.items(): print (key, " = ", value) Server = Apache-Coyote/1.1 Cache-Control = Content-Type = text/html;charset=UTF-8 Content-Encoding = gzip Content-Length = 1284 Set-Cookie = ucloud=1;domain=.baidu.com;path=/;max-age=300 Pragma = no-cache
urllib 模块的方法如下:
1) urlretrieve(url [, filename [, reporthook [, data]]]):将一个网络对象 url 复制到本机文件 filename上。其中,参数 reporthook 是一个 hook 函数,在网络连接完成时会调用此 hook 函数一次,每读取一个区块也会调用此 hook 函数一次,参数 data 必须是 application/x-www-form-urlencoded 格式。例如:
import urllib.request urllib.request.urlretrieve("http://www.python.org", "copy.html") ('copy.html', <http.client.HTTPMessage object at 0x02DE28B0>)
2) urlcleanup():清除 urlretrieve() 方法所使用的高速缓存。
3) quote(string [, safe]):将字符串 string 中的特殊字符用 %xx 码取代。参数 safe 设置要引用的额外字符。例如:
import urllib.request urllib.request.quote("This & that are all books\n") 'This%20%26%20that%20are%20all%20books%0A'
4) quote_plus(string [, safe]):与 quote() 方法相同,但是空白将以加号(+)取代。
5) unquote(string):返回原始字符串。例如:
import urllib.request urllib.request.unquote("This%20%26%20that%20are%20all%20books%0A") 'This & that are all books\n'
下面的示例将读取 http://www.python.org 主页的内容。
import urllib.request response = urllib.request.urlopen("http://www.python.org") html = response.read()也可以使用以下代码实现上述功能:
import urllib.request req = urllib.request.Request("http://www.python.org") response = urllib.request.urlopen(req) the_page = response.read()
下面的示例将 http://www.python.org 网页存储到本机的 13.2.html 文件中。
import urllib.request #打开网页文件 htmlhandler = urllib.request.urlopen("http://www.python.org") #在本机上创建一个新文件 file = open("13.2.html", "wb") #将网页文件存储到本机文件上,每次读取512字节 while 1: data = htmlhandler.read(512) if not data: break file.write(data) #关闭本机文件 file.close() #关闭网页文件 htmlhandler.close()保存并运行程序,即可将 http://www.python.org 网页存储到本机的 13.2.html 文件中。
urllib parse模块
parse 模块解析 URL 字符串并返回一个元组:(addressing scheme, netword location, path,parameters, query, fragment identifier)。parse 模块可以将 URL 分解成数个部分,并能组合回来,还可以将相对地址转换为绝对地址。parse 模块的方法如下:
1) urlparse(urlstring [, default_scheme [, allow_fragments]]):将一个 URL 字符串分解成 6 个元素,即 addressing scheme、netword location、path、parameters、query、fragment identifier。若设置参数 default_scheme,则指定 addressing scheme;若设置参数 allow_fragments 为 0,则不允许 fragment identifier。例如:
import urllib.parse url = "http://home.netscape.com/assist/extensions.html#topic1?x= 7&y= 2" urllib.parse.urlparse(url) ('http', 'home.netscape.com', '/assist/extensions.html', '', '', 'topic1?x= 7&y=2') ParseResult(scheme='http', netloc='home.netscape.com', path='/assist/extensions.html', params='', query='', fragment='topic1?x= 7&y= 2')
2) urlunparse(tuple):使用 tuple 创建一个 URL 字符串。例如:
import urllib.parse t = ("http", "www.python.org", "/News.html", "", "", "") urllib.parse.urlunparse(t) 'http://www.python.org/News.html'
3) urljoin(base, url [, allow_fragments]):使用 base 与 url 创建一个绝对 URL 地址。例如:
import urllib.parse urllib.parse.urljoin("http://www.python.org", "/News.html") 'http://www.python.org/News.html'