Python相对完美的URL拼接函数

本文探讨了URL拼接与路径正规化的问题,通过实例展示了如何使用Python进行路径正规化的操作,并提供了一个自定义函数来解决路径非正规化的问题。包括使用urljoin拼接URL、使用urlparse分离路径、应用posixpath.normpath进行正规化以及最终组装URL的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

首先说下什么叫URL拼接,我们有这么一个HTML片段:

做为一只辛苦的爬虫,我们要跟踪到这个click me指向的页面,假设这个片段来自:http://www.xxxdu.com,那么目标页面是什么呢?

显然不是

而是

第一个结果看着很脑残,但是这就是Python的urljoin给出的结果,按理说urljoin应该解决这个“路径非正规化”(Normalize path )的问题,但是它没有:

OK,其实这个问题的解决根本不再URL上,因为URL已经拼接了,更准确的描述这个问题应该是路径的正规化,即xxx.com后面的这部分路径,如果我们把它想象成Unix路径,不就是求相对论路径”/../../a.html”的绝对路径么?

我们可以用查找、正则表达式把后面这部分分离出来,更省事的方法是urlparse:

上述结果的第2部分, arr[2]就是我们要的path啦。

然后Python提供了Unix路径的正规化函数posixpath.normpath

最后我们把正规化好的path重新组装成url,于是整个函数出炉:

输出结果:

 

<think>嗯,用户想了解Python中与URL相关的函数及其用法,特别是使用方法示例。首先,我需要回忆一下Python中处理URL的常用模块,比如urllib、Django的路由系统,可能还有Flask的相关函数。 首先,urllib模块是Python标准库里的,包含request、parse等子模块。比如urlparse可以用来解析URL,分解成协议、域名、路径等部分。应该举一个例子,用urllib.parse.urlparse来解析一个示例URL,比如'https://www.example.com/path?query=123',然后展示各个组成部分。 然后,urljoin函数也很实用,用于拼接基础URL相对路径。例如,基础URL是'http://example.com/path/',相对路径是'subpage',合并后的结果应该是'http://example.com/path/subpage'。这需要示例代码说明。 接下来是Django框架中的path函数,用于URL路由配置。根据用户提供的引用[1],当Django匹配到路由时,会调用对应的视图函数,并传入HttpRequest对象捕获的参数。需要给出一个简单的Django路由例子,比如path('article/<int:id>/', views.article_view),然后解释参数如何传递到视图函数。 然后是Flask的route装饰器,Django类似,但语法不同。比如@app.route('/user/<username>'),然后视图函数接收username参数。这里需要示例代码,展示如何定义路由处理参数。 另外,用户提到的引用[2]中的!r格式化,可能在示例中展示如何输出参数,比如在视图函数里使用repr形式记录日志,但这点可能URL处理关系不大,不过可以适当提及。 还要注意用户要求行内数学表达式用$...$,但这个问题可能不需要数学公式,但如果有涉及到变量,比如路径参数,可能需要用$...$包裹,比如路径参数<int:id>中的id变量。 需要检查是否有独立公式需要用$$...$$,但URL处理可能不需要,所以可能这部分可以忽略,但确保其他LaTeX语法正确。 生成的相关问题可能需要包括不同框架的处理方法,比如Django vs Flask,或者如何处理查询参数,或者URL编码的问题。比如用户可能想知道如何获取查询字符串中的参数,这时候在Django中是request.GET,Flask是request.args,需要举例说明。 还需要确保回答结构清晰,分点说明每个函数或模块的用法,并给出示例代码。可能的结构是按模块分,比如urllib、Django、Flask,每个部分下介绍相关函数,示例代码,然后注意事项。 检查是否有遗漏的重要函数,比如requests库中的URL处理,但用户可能更关注标准库Web框架内置的函数。所以可能不需要涉及第三方库,除非用户特别提到。 最后,确保引用标记正确,比如引用[^1]对应Django的path函数说明,引用[^2]可能用于格式化输出的示例,但需要看是否相关。在示例中,如果引用了用户提供的引用内容,需要在相应位置添加标记。</think>### PythonURL处理函数及用法详解 在Python中,URL处理涉及解析、构建路由等功能,常用的模块包括标准库`urllib`Web框架(如Django、Flask)的路由系统。以下是具体函数及示例: --- #### 1. **`urllib.parse`模块** 用于解析构建URL,包含多个实用函数: - **`urlparse()`**:分解URL为协议、域名、路径等组件 ```python from urllib.parse import urlparse url = 'https://www.example.com/path?query=123#fragment' parsed = urlparse(url) print(parsed.scheme) # 输出: https print(parsed.netloc) # 输出: www.example.com print(parsed.path) # 输出: /path ``` - **`urljoin()`**:合并基础URL相对路径 ```python from urllib.parse import urljoin base = 'http://example.com/path/' relative = 'subpage' full_url = urljoin(base, relative) # 输出: http://example.com/path/subpage ``` --- #### 2. **Django框架的`path()`函数** 用于定义URL路由规则,将请求映射到视图函数[^1]: ```python # urls.py from django.urls import path from . import views urlpatterns = [ path('article/<int:id>/', views.article_view, name='article-detail'), ] # views.py def article_view(request, id): # 通过id查询文章数据 return HttpResponse(f"Article ID: {id}") ``` - **参数说明**:`<int:id>`表示捕获整数类型的`id`参数,并传递给视图函数。 --- #### 3. **Flask框架的`route()`装饰器** 通过装饰器定义路由规则,支持动态参数: ```python from flask import Flask app = Flask(__name__) @app.route('/user/<username>') def show_user_profile(username): return f'Username: {username}' @app.route('/post/<int:post_id>') def show_post(post_id): return f'Post ID: {post_id}' ``` - **动态参数**:`<username>`捕获字符串,`<int:post_id>`限制为整数。 --- #### 4. **处理查询参数** 在Web框架中获取URL的查询参数(如`?key=value`): - **Django**:通过`request.GET`字典 ```python def search(request): query = request.GET.get('q', '') # 获取参数q的值 return HttpResponse(f"Search query: {query}") ``` - **Flask**:通过`request.args`字典 ```python from flask import request @app.route('/search') def search(): query = request.args.get('q', '') return f"Search query: {query}" ``` --- ### 注意事项 - **URL编码**:使用`urllib.parse.quote()`处理特殊字符 ```python from urllib.parse import quote encoded = quote('Hello World!') # 输出: Hello%20World%21 ``` - **格式化输出**:使用`!r`确保字符串可安全拼接(参考示例) ```python print(f"URL: {url!r}") # 保留引号,便于调试 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值