You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python Django从字符串中提取URL?

在Django中提取URL并转为列表的可行方法

嘿,我明白你遇到的问题了——想把Django里的URL提取出来当成列表处理,但直接操作没成功对吧?下面给你两种常用的解决方案,看哪种符合你的需求:

一、提取Django项目中所有注册的路由URL

如果你的需求是遍历项目里定义的所有路由(比如urls.py里的配置),因为Django的路由是嵌套树形结构,直接拿url_patterns可能会漏掉嵌套的include路由,所以得用递归遍历的方式:

实现代码

首先导入需要的模块(注意Django版本差异:Django 2.0+用django.urls.resolvers,旧版本用django.core.urlresolvers):

from django.urls.resolvers import get_resolver
from django.urls import reverse

然后写一个递归函数来遍历所有路由:

def get_all_project_urls(resolver=None, prefix=''):
    # 初始化路由解析器,默认用项目根路由
    if resolver is None:
        resolver = get_resolver()
    url_list = []
    
    for pattern in resolver.url_patterns:
        # 判断当前路由是否包含子路由(比如用了include)
        if hasattr(pattern, 'url_patterns'):
            # 递归处理子路由,拼接前缀路径
            child_urls = get_all_project_urls(pattern, prefix + pattern.pattern.regex.pattern)
            url_list.extend(child_urls)
        else:
            # 处理单个路由:优先用reverse生成标准URL(需要路由有name参数)
            try:
                full_url = reverse(pattern.name)
                url_list.append(full_url)
            except:
                # 如果路由没有name,直接用正则匹配的路径
                url_path = prefix + pattern.pattern.regex.pattern
                url_list.append(url_path)
    
    return url_list

使用方式

调用函数就能得到所有URL的列表:

all_urls = get_all_project_urls()
# 打印结果看看
for url in all_urls:
    print(url)

二、从文本字符串中提取URL

如果你的需求是从一段文本(比如用户输入、数据库字段)里提取包含的URL,那用正则表达式就足够了:

实现代码

import re

def extract_urls_from_text(text_content):
    # 匹配HTTP/HTTPS开头的常见URL正则
    url_regex = re.compile(
        r'https?://(?:www\.)?[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+(?:/[^\s]*)?'
    )
    # 找出所有匹配的URL并返回列表
    return url_regex.findall(text_content)

使用方式

sample_text = "你可以访问https://example.com或者http://test.org/page1查看内容"
extracted_urls = extract_urls_from_text(sample_text)
print(extracted_urls)
# 输出: ['https://example.com', 'http://test.org/page1']

注意事项

  • 第一种方法里,如果路由没有设置name参数,reverse会抛出异常,所以我们加了异常捕获,用正则路径替代;
  • 如果你用的是Django旧版本(1.x),记得把from django.urls.resolvers import get_resolver改成from django.core.urlresolvers import get_resolver;
  • 正则提取URL的规则可以根据你的需求调整,比如要匹配带参数的URL、ftp协议的URL等,可以修改正则表达式。

内容的提问来源于stack exchange,提问作者bbrooke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:14:48