Python 中的 Urljoin 简介

news/2024/10/23 7:30:58/

文章目录

    • 介绍Python中的urljoin及其使用方法
      • 使用urljoin()方法
      • 使用urljoin()模块构建URLs
      • 使用urljoin()构建URLs


本篇文章介绍了 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 urljoinbase = '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 urlparseurl_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问题。


http://www.ppmy.cn/news/1130758.html

相关文章

AutoAnimate - 无需任何配置,一行代码自动为元素添加优雅的过渡动画,可以搭配 Vue / React 和 Sevelt 使用

这个动画库只要一行代码就可以自动在我们的组件中添过渡动画&#xff0c;为什么这么省事高效呢&#xff1f; AutoAnimate 是一个无需任何配置&#xff0c;自动为我们开发的 Web 项目添加平滑过渡动画的 JavaScript 工具库。AutoAnimate 和之前推荐的一些 js 动画库相比&#x…

Java之SpringCloud Alibaba【六】【Alibaba微服务分布式事务组件—Seata】

一、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 在关系数据库中&#xff0c;一个事务由一组SQL语句组成。 事务应该具有4个属性: 原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性(atomicity) ∶个事务…

数学建模Matlab之评价类方法

大部分方法来自于http://t.csdnimg.cn/P5zOD 层次分析法 层次分析法&#xff08;Analytic Hierarchy Process, AHP&#xff09;是一种结构决策的定量方法&#xff0c;主要用于处理复杂问题的决策分析。它将问题分解为目标、准则和方案等不同层次&#xff0c;通过成对比较和计算…

vue 实现数字验证码功能

需求&#xff1a;写了一个 手机发送验证码后 输入固定验证码的功能 封装成一个组件,如下: <template><div class"conts"><div class"box"><div class"code_list"><div :class"[ code_item, hideIndex 0 ? co…

【Flink】

事件驱动型应用 核心目标&#xff1a;数据流上的有状态计算 Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界或有界数据流进行有状态计算。 运行逻辑 状态 把流处理需要的额外数据保存成一个“状态”,然后针对这条数据进行处理,并且更新状态。这就是所谓的“…

孤举者难起,众行者易趋,openGauss 5.1.0版本正式发布!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

基于51单片机数字电压表仿真设计_数码管显示(程序+仿真+原理图+PCB+报告+讲解视频)

基于51单片机数字电压表仿真设计_数码管显示&#xff08;程序仿真原理图PCB报告讲解视频&#xff09; 原理图&#xff1a;Altium Designer 仿真版本&#xff1a;proteus 7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0…

java中发射实现的三种方式

三种反射实现方式 通过 new 对象实现反射机制&#xff1b;通过路径实现反射机制&#xff1b;通过类名实现反射机制。 对象.getClass() User user new User(); Class userClass1 user.getClass(); System.out.println(userClass1.getName());通过所在路径 Class userClass…