Python函数用于清理和规范化URL

9 投票
4 回答
19104 浏览
提问于 2025-04-16 13:26

我正在使用网址作为键,所以我需要它们保持一致和干净。我需要一个Python函数,可以接收一个网址并将其清理,以便我能从数据库中获取数据。例如,它会接收以下内容:

example.com
example.com/
http://example.com/
http://example.com
http://example.com?
http://example.com/?
http://example.com//

然后输出一个干净一致的版本:

http://example.com/

我查看了标准库和GitHub,但没有找到类似的东西。

更新

我找不到一个Python库,能够实现这里和RFC中讨论的所有内容:

http://en.wikipedia.org/wiki/URL_normalization

所以我现在正在自己写一个。这个事情比我最开始想的要复杂得多。

4 个回答

1

url-normalize 可能正是你需要的工具。

根据你的需求,你还可以尝试:

  1. 去掉 UTM 参数
  2. 去掉 http(s)://
  3. 去掉 www.
  4. 去掉末尾的 /

下面是一个可以实现这些功能的例子:

from w3lib.url import url_query_cleaner
from url_normalize import url_normalize

urls = ['example.com',
'example.com/',
'http://example.com/',
'http://example.com',
'http://example.com?',
'http://example.com/?',
'http://example.com//',
'http://example.com?utm_source=Google']


def canonical_url(u):
    u = url_normalize(u)
    u = url_query_cleaner(u,parameterlist = ['utm_source','utm_medium','utm_campaign','utm_term','utm_content'],remove=True)

    if u.startswith("http://"):
        u = u[7:]
    if u.startswith("https://"):
        u = u[8:]
    if u.startswith("www."):
        u = u[4:]
    if u.endswith("/"):
        u = u[:-1]
    return u

list(map(canonical_url,urls))

运行后会得到这样的结果:

['example.com',
 'example.com',
 'example.com',
 'example.com',
 'example.com',
 'example.com',
 'example.com',
 'example.com']

不过,对于缩短链接和各种重定向的问题,还是会有一些麻烦,你需要请求这个网址才能处理这些问题。

9

这个功能是用scrapy实现的:

http://nullege.com/codes/search/scrapy.utils.url.canonicalize_url

这个过程是为了规范化给定的URL,具体步骤如下:

  • 对查询参数进行排序,先按键名排序,再按值排序
  • 对路径和查询参数进行百分号编码。对于非ASCII字符,使用UTF-8进行编码(遵循RFC-3986标准)
  • 将所有空格(在查询参数中)规范化为'+'(加号)
  • 规范化百分号编码的大小写(比如将%2f变成%2F)
  • 去掉值为空的查询参数(除非设置了keep_blank_values为True)
  • 去掉片段(除非设置了keep_fragments为True)
9

看看这个 urlparse.urlparse()。我用这个方法效果很好。


注意:这个回答是2011年的,适用于Python2。在Python3中,urlparse模块改名为urllib.parse。关于urllib.parse的Python3文档可以在这里找到:

https://docs.python.org/3/library/urllib.parse.html

撰写回答