首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >规范化/规范化URL?

规范化/规范化URL?
EN

Stack Overflow用户
提问于 2012-05-14 22:02:14
回答 5查看 11.5K关注 0票数 11

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

我更喜欢Python3,并且已经看过了urllib模块。它提供了拆分URL的功能,但没有提供规范化URL的功能。Java有做类似事情的URI.normalize()函数(尽管它不认为缺省端口80等于没有给定的端口),但是python中有类似的东西吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-19 21:29:26

遵循good start,我编写了一个方法,适用于web中常见的大多数情况。

代码语言:javascript
复制
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,
    ''))
票数 0
EN

Stack Overflow用户

发布于 2012-05-15 00:34:02

这样如何:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-03-26 12:56:52

这就是我所使用的,到目前为止,它是有效的。您可以从pip获取urlnorm。

注意,我对查询参数进行了排序。我发现这是很重要的。

代码语言:javascript
复制
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, ''))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10584861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档