Python 中的 Urljoin 简介


本篇文章介绍了 Python urljoin 及其使用时的行为。 它还使用不同的示例代码演示了在 Python 中使用 urljoin。


介绍Python中的urljoin及其使用方法

URL通常包含了在评估网站、参与者搜索或区分不同领域的材料时所需的关键信息。

尽管URL可能看起来相当复杂,但Python提供了许多有价值的库,可以解析、连接URL并检索URL的组成部分。

Python 3中的urllib包使用户能够从脚本内部探索网站,并包含了几个模块来管理URL函数,如urljoin()。

在Python编程中使用URL时,urllib库至关重要,它允许用户使用通用资源定位符(URL)访问和与网站交互。

此外,该库还提供了更多的包,如urllib.request、urllib.error、urllib.parse和urllib.robotparser。

使用urljoin()方法

urljoin()方法在需要多个相关URL的情况下非常有用。例如,用于为网站生成一组页面的URL以及向基本URL添加新值。

语法:

urljoin(baseurl, newurl, allowFrag=None)

通过将基本URL(baseurl)与另一个URL(newurl)组合构建完整的URL,urljoin()方法使用基本URL的部分作为地址方案、网络位置和路径,以提供相对URL中缺失的部分。

例如:

from urllib.parse import urljoin
print(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的主机名和/或方案。例如:

from urllib.parse import urljoin
print(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() - 该模块使用户能够快速将URL分解为不同的部分,并从URL中筛选出特定的部分。
  • 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分成许多组件,超出主要地址。使用urlphase()方法可以将用于特定查询或附加到URL的标签分开,如下所示。

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

下面的示例代码显示并解释了从不同部分构建URL的行为,以了解从urllib.parse导入的 urljoin() 方法的行为。

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

以上代码中,第一个参数可以被视为baseurl(假设urljoin()的语法),可以等同于浏览器上显示的页面。

第二个参数newurl可以被视为该页面上锚点的href。作为结果,当用户点击时,最终的URL将指向一个页面。

当考虑虚拟托管方面和类似Baz的锚点时,人们还可以将baseurl包括方案和域。

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

输出结果:

'http://test/task'

在上面的示例中,链接将用户指向URL,考虑了虚拟托管方面和类似 <a href='task'>Baz</a> 的锚点。

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

输出结果:

'http://test/task'

如上所示,添加另一部分test/add将创建指向task的相对链接,该链接将用户指向上述URL。

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

输出结果:

'http://test/add/task'

这里添加了test/add/,将会指向不同的相对链接:test/add/task。

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

输出结果:

'http://test/task'

如果用户在 test/add/ 上并且href为/task,它将链接用户到test/task。因此,我们可以说Python中的 urljoin() 是一个有用的函数,可以根据需要解决URL问题。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迹忆客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值