Python 简明教程
Python - URL Processing
在互联网世界中,不同的资源由 URL(统一资源定位符)标识。Python 的标准库包括 urllib 包,其中包含用于处理 URL 的模块。它可以帮助你解析 URL、获取网络内容和管理错误。
本教程介绍了 urllib 基础知识,以帮助你开始使用它。使用 urllib 提升你在网络抓取、数据获取和 URL 管理方面的 Python 技能。
urllib 包包含以下用于处理 URL 的模块 −
-
urllib.parse 模块用于将 URL 解析成其各部分。
-
urllib.request 模块包含用于打开和读取 URL 的函数
-
urllib.error 模块承载 urllib.request 引发的异常的定义
-
urllib.robotparser 模块解析 robots.txt 文件
The urllib.parse Module
此模块用作一个标准接口,以从 URL 字符串获取各个部分。该模块包含以下函数−
Example
from urllib.parse import urlparse
url = "https://example.com/employees/name/?salary>=25000"
parsed_url = urlparse(url)
print (type(parsed_url))
print ("Scheme:",parsed_url.scheme)
print ("netloc:", parsed_url.netloc)
print ("path:", parsed_url.path)
print ("params:", parsed_url.params)
print ("Query string:", parsed_url.query)
print ("Frgment:", parsed_url.fragment)
它将生成以下 output −
<class 'urllib.parse.ParseResult'>
Scheme: https
netloc: example.com
path: /employees/name/
params:
Query string: salary>=25000
Frgment:
parse_qs(qs))
此函数解析给定为字符串参数的查询字符串。数据作为字典返回。字典键是唯一的查询变量名,值是每个名称的值列表。
要进一步从查询字符串提取查询参数到字典中,请按如下方式使用 ParseResult 对象的 query 属性的 parse_qs() 函数 −
Example
from urllib.parse import urlparse, parse_qs
url = "https://example.com/employees?name=Anand&salary=25000"
parsed_url = urlparse(url)
dct = parse_qs(parsed_url.query)
print ("Query parameters:", dct)
它将生成以下 output −
Query parameters: {'name': ['Anand'], 'salary': ['25000']}
urlsplit(urlstring)
这类似于 urlparse(),但不会从 URL 中分离参数。如果想要较新的 URL 语法,允许将参数应用于 URL 的路径部分的每个部分,则通常应该使用它代替 urlparse()。
urlunparse(parts)
此函数与 urlparse() 函数相反。它根据 urlparse() 返回的元组构造一个 URL。parts 参数可以是任何六项可迭代对象。这会返回一个等效的 URL。
The urllib.request Module
此模块通过使用 urlopen() 函数提供了用于处理 URL 的打开和读取操作的函数和类。
The Request Object
urllib.request 模块包括 Request 类。此类是 URL 请求的抽象类。构造函数需要一个有效的 URL 字符串参数。
Parameters
-
url − 一个有效 URL 的字符串
-
data − 一个指定要发送到服务器的其他数据对象。此参数仅能与 HTTP 请求一并使用。数据可以是字节、类文件对象和类字节对象的迭代对象。
-
headers − 应该是包含标头及其关联值的字典。
-
origin_req_host − 应该是原始交易的请求主机
-
method − 应该是指示 HTTP 请求方法的字符串。GET、POST、PUT、DELETE 和其他 HTTP 动词之一。默认值为 GET。
Example
from urllib.request import Request
obj = Request("https://www.tutorialspoint.com/")
此 Request 对象现在可用作 urlopen() 方法的参数。
from urllib.request import Request, urlopen
obj = Request("https://www.tutorialspoint.com/")
resp = urlopen(obj)
urlopen() 函数返回一个 HttpResponse 对象。调用其 read() 方法可抓取指定 URL 的资源。
from urllib.request import Request, urlopen
obj = Request("https://www.tutorialspoint.com/")
resp = urlopen(obj)
data = resp.read()
print (data)
Sending Data
如果为 Request 构造函数定义数据参数,将向服务器发送 POST 请求。数据应为任何以字节表示的对象。
from urllib.request import Request, urlopen
from urllib.parse import urlencode
values = {'name': 'Madhu',
'location': 'India',
'language': 'Hindi' }
data = urlencode(values).encode('utf-8')
obj = Request("https://example.com", data)
The urllib.error Module
urllib.error 模块中定义了以下异常 −
URLError
由于网络未连接(找不到路由到指定服务器)或指定的服务器不存在,因此会引发 URLError。在此情况下,引发的异常将具有“原因”属性。
Example
from urllib.request import Request, urlopen
import urllib.error as err
obj = Request("http://www.nosuchserver.com")
try:
urlopen(obj)
except err.URLError as e:
print(e)
它将生成以下 output −
HTTP Error 403: Forbidden
HTTPError
服务器每次发送 HTTP 响应时都会与一个数字“状态码”相关联。该代码指示服务器无法满足请求的原因。默认处理程序将为您处理其中一些响应。对于它无法处理的响应,urlopen() 函数会引发 HTTPError。HTTPErrors 的典型示例为“404”(页面未找到)、“403”(禁止请求)和“401”(需要身份验证)。
Example
from urllib.request import Request, urlopen
import urllib.error as err
obj = Request("http://www.python.org/fish.html")
try:
urlopen(obj)
except err.HTTPError as e:
print(e.code)
它将生成以下 output −
404