Python函数用于清理和规范化URL
我正在使用网址作为键,所以我需要它们保持一致和干净。我需要一个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 可能正是你需要的工具。
根据你的需求,你还可以尝试:
- 去掉 UTM 参数
- 去掉
http(s)://
- 去掉
www.
- 去掉末尾的
/
下面是一个可以实现这些功能的例子:
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文档可以在这里找到: