• 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)
    
    • 1

    通过将基本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'))
    
    • 1
    • 2

    输出结果:

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

    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'))
    
    • 1
    • 2

    输出结果:

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

    如果输出结果与预期不符,请使用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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出结果:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    是否有一种方法可以在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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出结果:

    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')
    
    • 1
    • 2

    使用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'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

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

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

    输出结果:

    'http://test/task'
    
    • 1

    在上面的示例中,链接将用户指向URL,考虑了虚拟托管方面和类似 Baz 的锚点。

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

    输出结果:

    'http://test/task'
    
    • 1

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

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

    输出结果:

    'http://test/add/task'
    
    • 1

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

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

    输出结果:

    'http://test/task'
    
    • 1

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

  • 相关阅读:
    勾勾-MIAN
    漏洞检测与EPSS评分
    微信小程序 java精品课程在线学习平台
    二叉树的非递归法及层序遍历
    word怎么公式求平均值
    云计算 - 内容分发网络CDN技术与应用全解
    LeetCode-268(Python)—— 丢失的数字
    Mysql插入或者更新数据(MyBatis框架)
    不好意思,Nginx 该换了!
    前端面试题JavaScript篇——2022-09-16
  • 原文地址:https://blog.csdn.net/fengqianlang/article/details/133377851