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

Posted

技术标签:

【中文标题】Python 中用于清理和规范化 URL 的函数【英文标题】:Function in Python to clean up and normalize a URL 【发布时间】:2011-07-12 20:36:45 【问题描述】:

我使用 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 库和 GitHub,找不到类似的东西

更新

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

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

所以我现在正在写一个。这比我最初想象的要多得多。

【问题讨论】:

标准化的清理表单应该是http://example.com/而不是http://example.com,没有路径组件的HTTP URL在技术上是不正确的。 你需要定义干净。这是否意味着绝对URL?还是规范网址? 我真正的意思是规范化,当我早上 5 点输入这个词时,我并没有真正想到这个词。 urlparse() 看起来像我想要的,当我今天早上阅读文档时,我没有注意到该函数的规范化方面。 看到这个帖子***.com/questions/5371992/… How can I normalize a URL in python的可能重复 【参考方案1】:

看看urlparse.urlparse()。我已经取得了很好的成功。


注意:此答案来自 2011 年,特定于 Python2。在 Python3 中,urlparse 模块已命名为 urllib.parseurllib.parse 对应的 Python3 文档可以在这里找到:

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

【讨论】:

连同 urlparse.urlunparse(). 谢谢你——由于某种原因,我今天早上阅读文档时错过了该函数的规范化方面。我花了几分钟来实现 从头开始 - 我的测试用例中有 70% 以上的规范化失败(我现在有 50 个测试)。出于某种原因,python 社区反对根据 RFC 以及浏览器如何处理它来实现规范化:en.wikipedia.org/wiki/URL_normalization 我发现了这个 python 错误:bugs.python.org/issue4191 补充一下,urlparse规范化不会发现问题中的上面的URL都是相等的,这很重要。 链接已失效【参考方案2】:

在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)

【讨论】:

至少现在 Scrapy 从 w3lib package 导入这个函数。【参考方案3】:

url-normalize 可能就是您要找的。​​p>

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

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

仍然存在各种缩短链接和重定向的问题,但您需要向 url 发出请求以对它们进行排序。

【讨论】:

【参考方案4】:

您是否考虑过使用常规表达式?他们将帮助您检查格式错误的 URL。我已经在我的一个应用程序中使用了它

"^[, .a-zA-Z0-9]*$"

【讨论】:

它没有回答问题。

以上是关于Python 中用于清理和规范化 URL 的函数的主要内容,如果未能解决你的问题,请参考以下文章

规范化/规范化 URL?

python笔记

python注释规范

Python编程规范

NFT 新规发行,引导国内 NFT 健康发展

处理来自不同函数的多个返回数据集 python pandas