Python中的函数用于清理和标准化URL

时间:2011-03-10 16:14:36

标签: python url

我使用URL作为键,所以我需要它们是一致的和干净的。我需要一个python函数,它将获取一个URL并清理它,以便我可以从数据库中获取。例如,它将采取以下措施:

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

并输出一个干净的一致版本:

http://example.com/

我浏览了std libs和github,找不到这样的东西

更新

我找不到实现此处和RFC中所讨论的所有内容的Python库:

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

所以我现在正在写一篇。除了我最初想象的还有很多东西。

4 个答案:

答案 0 :(得分:8)

看看urlparse.urlparse()。我用它取得了很大的成功。


note :这个答案来自2011年,特别针对Python2。在Python3中,urlparse模块已命名为urllib.parse。可以在此处找到urllib.parse的相应Python3文档:

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

答案 1 :(得分:6)

这是在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)
  •   

答案 2 :(得分:-1)

您是否考虑过使用常规xpressions?他们会帮助您检查格式错误的网址。我在我的一个应用程序中使用过它

“^ [,。a-zA-Z0-9] * $”

答案 3 :(得分:-1)

url-normalize可能就是您想要的。

根据您的喜好,您还可以:

  1. 删除UTM parameters
  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']

链接和重定向缩短或各种排序仍然存在问题,但是您需要向url请求以对这些内容进行排序。