规范化/规范化URL?

问题描述 投票:11回答:5

我正在搜索库函数以标准化Python中的URL,即删除路径中的“ ./”或“ ../”部分,或添加默认端口或转义特殊字符,等等。结果应为对于指向同一网页的两个URL唯一的字符串。例如,http://google.comhttp://google.com:80/a/../将返回相同的结果。

我更喜欢Python 3,并且已经通过urllib模块进行了研究。它提供了拆分URL的功能,但没有任何规范化它们的功能。 Java具有执行类似功能的URI.normalize()函数(尽管它不认为默认端口80等于没有给定的端口),但是是否有类似python的东西?

url python-3.x normalization
5个回答
4
投票

怎么样:

In [1]: from urllib.parse import urljoin

In [2]: urljoin('http://example.com/a/b/c/../', '.')
Out[2]: 'http://example.com/a/b/'

受到this question答案的启发。它没有规范化端口,但是它应该很简单地产生一个函数。


4
投票

这是我使用的方法,到目前为止已经有效。您可以从pip获取urlnorm。

注意,我对查询参数进行了排序。我发现这是必不可少的。

from urlparse import urlsplit, urlunsplit, parse_qsl
from urllib import urlencode
import urlnorm

def canonizeurl(url):
    split = urlsplit(urlnorm.norm(url))
    path = split[2].split(' ')[0]

    while path.startswith('/..'):
        path = path[3:]

    while path.endswith('%20'):
        path = path[:-3]

    qs = urlencode(sorted(parse_qsl(split.query)))
    return urlunsplit((split.scheme, split.netloc, path, qs, ''))

2
投票

urltools模块规范化多个斜杠,...组件,而不会弄乱http://中的双斜杠。

一旦执行pip install urltools,用法如下:

print urltools.normalize('http://domain.com:80/a////b/../c')
>>> 'http://domain.com/a/c'

0
投票

[C0之后,我组成了一种方法,它适合于网络上常见的大多数情况。

good start

0
投票

现在有一个专门解决此确切问题的库def urlnorm(base, link=''): '''Normalizes an URL or a link relative to a base url. URLs that point to the same resource will return the same string.''' new = urlparse(urljoin(base, url).lower()) return urlunsplit(( new.scheme, (new.port == None) and (new.hostname + ":80") or new.netloc, new.path, new.query, ''))

它不仅仅是按照文档规范化路径:

URI归一化功能:

  1. 请注意IDN域。
  2. 始终以小写字符提供URI方案。
  3. 总是以小写字符提供主机名。
  4. 仅在必不可少的地方执行百分比编码。
  5. 百分比编码时始终使用大写A-F字符。
  6. 防止出现在非相对URI路径中的点段。
  7. 对于定义默认权限的方案,如果需要默认权限,请使用空权限。
  8. 对于将空路径定义为等同于路径“ /”的方案,请使用“ /”。
  9. 对于定义端口的方案,如果需要默认端口,请使用空端口
  10. URI的所有部分都必须是来自Unicode字符串的utf-8编码的NFC

这里是一个例子:

url-normalize

哪个给:

from url_normalize import url_normalize

url = 'http://google.com:80/a/../'
print(url_normalize(url))
© www.soinside.com 2019 - 2024. All rights reserved.