在 Internet 世界中,不同的资源由 URL(统一资源定位器)标识。Python 的标准库包括 urllib 包,其中包含用于处理 URL 的模块。它可以帮助您解析 URL、获取 Web 内容和管理错误。
本教程介绍了 urllib 基础知识,以帮助您开始使用它。使用 urllib 提高您使用 Python 进行网络抓取、获取数据和管理 URL 的技能。
urllib 包包含以下用于处理 URL 的模块 -
- urllib.parse 模块用于将 URL 解析为其部分。
- urllib.request 模块包含用于打开和读取 URL 的函数
- urllib.error 模块携带 urllib.request 引发的异常的定义
- urllib.robotparser 模块解析 robots.txt 文件
urllib.parse 模块
此模块用作从 URL 字符串中获取各个部分的标准接口。该模块包含以下功能 -
urlparse(urlstring)
将 URL 解析为 6 个组件,返回一个包含 6 项的命名元组。每个元组项都是对应于以下属性的字符串 -
属笥 | Index | 值 |
---|---|---|
scheme | 0 | URL 方案说明符 |
netloc | 1 | 网络位置部分 |
path | 2 | 分层路径 |
params | 3 | last path 元素的参数 |
query | 4 | Query 组件 |
fragment | 5 | 片段标识符 |
username | 用户名 | |
password | 密码 | |
hostname | 主机名(小写) | |
Port | 端口号为整数(如果存在) |
例
它将产生以下输出 -
Scheme: https
netloc: example.com
path: /employees/name/
params:
Query string: salary>=25000
Frgment:
parse_qs(QS))
此函数解析作为字符串参数给出的查询字符串。数据以字典形式返回。字典键是唯一的查询变量名称,值是每个名称的值列表。
要进一步将查询参数从查询字符串提取到字典中,请使用 ParseResult 对象的 query 属性的 parse_qs() 函数,如下所示 -
例
它将产生以下输出 -
urlsplit(urlstring)
这类似于 urlparse(),但不会从 URL 中拆分参数。如果需要允许将参数应用于 URL 路径部分的每个段的更新的 URL 语法,则通常应该使用它而不是 urlparse()。
urlunparse(parts)
此函数与 urlparse() 函数相反。它从 urlparse() 返回的元组构造一个 URL。parts 参数可以是任何六项可迭代对象。这将返回等效的 URL。
例
它将产生以下输出 -
urlunsplit(parts)
将 urlsplit() 返回的元组元素合并为一个完整的 URL,作为字符串。parts 参数可以是任何五项可迭代对象。
urllib.request 模块
该模块提供了使用 urlopen() 函数处理 URL 的打开和读取操作的函数和类。
urlopen() 函数
此函数将打开给定的 URL,该 URL 可以是字符串或 Request 对象。可选的 timeout 参数指定阻止操作的超时(以秒为单位)这实际上仅适用于 HTTP、HTTPS 和 FTP 连接。
此函数始终返回一个对象,该对象可以用作上下文管理器,并且具有属性 url、headers 和 status。对于 HTTP 和 HTTPS URL,此函数返回略微修改的 http.client.HTTPResponse 对象。
例下面的代码使用 urlopen() 函数从图像文件中读取二进制数据,并将其写入本地文件。您可以使用任何图像查看器在计算机上打开图像文件。
它将产生以下输出 -

请求对象
urllib.request 模块包括 Request 类。此类是 URL 请求的抽象。构造函数需要一个必需的字符串参数,一个有效的 URL。
语法
参数
- url - 作为有效 URL 的字符串
- data - 指定要发送到服务器的其他数据的对象。此参数只能用于 HTTP 请求。数据可以是字节、类文件对象和类字节对象的可迭代对象。
- headers − 应该是 headers 及其关联值的字典。
- origin_req_host − 应该是原始事务的请求主机
- method − 应为指示 HTTP 请求方法的字符串。GET、POST、PUT、DELETE 和其他 HTTP 动词之一。默认值为 GET。
例
此 Request 对象现在可以用作 urlopen() 方法的参数。
urlopen() 函数返回一个 HttpResponse 对象。调用其 read() 方法将获取给定 URL 中的资源。
发送数据
如果为 Request 构造函数定义 data 参数,则会向服务器发送 POST 请求。数据应为以字节表示的任何对象。
发送header
Request 构造函数还接受 header 参数,以将 header 信息推送到请求中。它应该位于 dictionary 对象中。
urllib.error 模块
以下异常在 urllib.error 模块中定义 -
URLError
引发 URLError 是因为没有网络连接(没有到指定服务器的路由),或者指定的服务器不存在。在这种情况下,引发的异常将具有 'reason' 属性。
例
它将产生以下输出 -
HTTPError
每次服务器发送 HTTP 响应时,它都会与一个数字 “状态代码” 相关联。它的代码指示服务器无法满足请求的原因。默认处理程序将为您处理其中一些响应。对于那些它无法处理的,urlopen() 函数会引发一个 HTTPError。HTTPError 的典型示例是 '404' (找不到页面)、'403' (请求被禁止) 和 '401' (需要身份验证)。
例
它将产生以下输出 -