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的问题。