Python中Urljoin的介绍

本教程介绍了Pythonurljoin 及其使用时的行为。它还使用不同的示例代码演示了Python中urljoin 的使用。

Python中的urljoin 介绍

URLs通常包括在评估一个网站、参与者的搜索或每个区域的材料安排时可以利用的基本信息。

有时,无论URLs是否显得相当复杂,Python都有各种有价值的库,让解析、连接URLs和检索URLs的组成部分。

Python 3中的urllib 包使用户能够从他们的脚本中探索网站,并且包含了几个管理URL功能的模块,如urljoin()

在Python编程中使用URL时,urllib 库是至关重要的,它允许用户使用其通用资源定位器访问网站并与之互动。

另外,这个库还提供了更多的包,如urllib.request,urllib.error,urllib.parse, 和urllib.robotparser

使用urljoin() 方法

urljoin() 方法在需要许多相关的URL时很有帮助。例如,要为一个网站生成一组页面的URL,并在基本URL上添加新的值。

语法:

urljoin(baseurl, newurl, allowFrag=None)

通过将一个基本的URL(baseurl)与另一个URL(newurl)结合起来构建一个完整的URL,非正式地,这使用基本URL的部分作为寻址方案、网络位置和路径来提供相对URL中的缺失部分。

作为一个例子:

>>> from urllib.parse import urljoin
>>> urljoin('http://www.cwi.nl:50/%7Eguido/Python.html', 'FAQ.html')

输出:

'http://www.cwi.nl:50/%7Eguido/FAQ.html'

allowFrag 参数的含义和默认值与urlparse() 相同。如果newurl 是一个以//scheme:// 开始的绝对URL,newurl‘shostname 和/或scheme 将出现在输出中。作为一个例子:

>>> from urllib.parse import urljoin
>>> urljoin('http://www.cwi.nl:50/%7Eguido/Python.html', '//www.python.org/%7Eguido')

输出:

'http://www.python.org/%7Eguido'

如果这不是除此之外的输出,用urlsplit()urlunsplit()newurl 进行预处理,去掉可能的方案和网络位置部分。

如果你关心的是功能,那么urlparse()urlsplit()urlunsplit() 的功能将在下面简要介绍:

  • urlparse() – 该模块使用户能够快速地将URLs分成不同的部分,并从URLs中过滤出任何特定的部分。
  • urlsplit() – 这个模块是urlparse() 的替代品,但不同的是,它不从URL中分割参数。urlsplit() 模块对遵循RFC 2396 的URL有帮助,它支持每个路径段的参数。
  • urlunsplit() – 这个模块的功能是将urlsplit() 所返回的元组元素结合起来,形成一个完整的字符串的URL。

使用urljoin() 模块来构建 URLs

Python中的requests 模块可以协助建立URL并动态地操作URL值。通过编程,可以获取URL的任何子目录,然后可以用新的值替换URL的某些部分,以建立新的URL。

下面的代码栅栏使用urljoin() 来获取URL路径中的不同子文件夹。urljoin() 用来向基本URL添加新的值,从而建立一个URL。

from requests.compat import urljoin
base='https://stackoverflow.com/questions/10893374'
print (urljoin(base,'.'))
print (urljoin(base,'..'))
print (urljoin(base,'...'))
print (urljoin(base,'/10893374/'))
url_query = urljoin(base,'?vers=1.0')
print (url_query)
url_sec = urljoin(url_query,'#section-5.4')
print (url_sec)

输出:

https://stackoverflow.com/questions/
https://stackoverflow.com/
https://stackoverflow.com/questions/...
https://stackoverflow.com/10893374/
https://stackoverflow.com/questions/10893374?vers=1.0
https://stackoverflow.com/questions/10893374?vers=1.0#section-5.4

有办法在Python中分割URL吗?当然,有!

我们可以把URL分割成主地址之外的许多组成部分。用于特定查询的附加参数或附加在URL上的标签用urlphase() 方法来分割,如下图所示。

from requests.compat import urlparse
url_01='https://docs.python.org/3/library/__main__.html?highlight=python%20hello%20world'
url_02 = 'https://docs.python.org/2/py-modindex.html#cap-f'
print (urlparse(url_01))
print (urlparse(url_02))

输出:

ParseResult(scheme='https', netloc='docs.python.org', path='/3/library/__main__.html', params='', query='highlight=python%20hello%20world', fragment='')
ParseResult(scheme='https', netloc='docs.python.org', path='/2/py-modindex.html', params='', query='', fragment='cap-f')

使用urljoin() 来形成URLs

为了理解从 urllib.parse 导入的 urljoin() 方法的行为,从不同部分形成的 URL 显示并解释了以下例子。

示例代码:

>>> from urllib.parse import urljoin
>>> urljoin('test', 'task')

输出:

'task'

示例代码:

>>> from urllib.parse import urljoin
>>> urljoin('http://test', 'task')

输出:

'http://test/task'

示例代码

>>> from urllib.parse import urljoin
>>> urljoin('http://test/add', 'task')

输出:

'http://test/task'

示例代码:

>>> from urllib.parse import urljoin
>>> urljoin('http://test/add/', 'task')

输出:

'http://test/add/task'

示例代码:

>>> from urllib.parse import urljoin
>>> urljoin('http://test/add/', '/task')

输出:

'http://test/task'

示例代码:

>>> from urllib.parse import urljoin
>>> urljoin('test', 'task')

输出:

'task'

在上面的片段中,第一个参数可以被认为是baseurl (假设是urljoin() 的语法),可以等于浏览器上显示的页面。

第二个参数,newurl ,可以看作是该页面上一个锚点的href 。作为结果,一旦被用户点击,最后的URL就会指向一个页面。

在考虑上述片段时,人们还可以考虑baseurl ,包括一个方案和域名。

示例代码:

>>> from urllib.parse import urljoin
>>> urljoin('http://test', 'task')

输出:

'http://test/task'

当考虑到虚拟主机方面和像<a href='task'>Baz</a> 这样的锚时,该链接可以将用户引向上述片段中的URL。

>>> from urllib.parse import urljoin
>>> urljoin('http://test/add', 'task')

输出:

'http://test/task'

添加另一个部分,如上面的test/add ,将创建一个相对链接到task ,将用户引导到上述URL。

>>> from urllib.parse import urljoin
>>> urljoin('http://test/add/', 'task')

输出:

'http://test/add/task'

这里添加了test/add/ ,将引导到不同的相对链接:test/add/task.

>>> from urllib.parse import urljoin
>>> urljoin('http://test/add/', '/task')

输出:

'http://test/task'

如果用户在test/add/ ,而href 是到/task ,它将把用户链接到test/task 。因此,我们可以说Python中的urljoin() 是一个方便的函数,它将在必要时帮助解决URL的问题。