我怎样才能正常化python中的URL(How can I normalize a URL in p

2019-06-17 20:28发布

我想知道我做的正常化python中的URL。

举例来说,如果我有一个URL字符串,如:“ http://www.example.com/foo咕/一个bar.html”

我需要在Python库,将改变额外的空间(或任何其他非标准化字符)到适当的URL。

Answer 1:

看看这个模块: werkzeug.utils 。 (今werkzeug.urls

您正在寻找的功能称为“url_fix”和是这样的:

>>> url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffsklärung)')
'http://de.wikipedia.org/wiki/Elf%20%28Begriffskl%C3%A4rung%29'

它在WERKZEUG实现如下:

import urllib
import urlparse

def url_fix(s, charset='utf-8'):
    """Sometimes you get an URL by a user that just isn't a real
    URL because it contains unsafe characters like ' ' and so on.  This
    function can fix some of the problems in a similar way browsers
    handle data entered by the user:

    >>> url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffsklärung)')
    'http://de.wikipedia.org/wiki/Elf%20%28Begriffskl%C3%A4rung%29'

    :param charset: The target charset for the URL if the url was
                    given as unicode string.
    """
    if isinstance(s, unicode):
        s = s.encode(charset, 'ignore')
    scheme, netloc, path, qs, anchor = urlparse.urlsplit(s)
    path = urllib.quote(path, '/%')
    qs = urllib.quote_plus(qs, ':&=')
    return urlparse.urlunsplit((scheme, netloc, path, qs, anchor))


Answer 2:

在Python 2.7真正的解决了这个问题

正确的解决方案是:

 # percent encode url, fixing lame server errors for e.g, like space
 # within url paths.
 fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]")

欲了解更多信息,请参阅Issue918368:“urllib的不正确的服务器返回的URL”



Answer 3:

使用urllib.quoteurllib.quote_plus

从urllib的文件 :

引号(字符串[安全])

替换使用“%XX”逃逸字符串特殊字符。 字母,数字和字符“_.-”从不引用。 可选的安全参数指定不应被引用其他字符 - 它的默认值是“/”。

例如: quote('/~connolly/')的产率'/%7econnolly/'

quote_plus(字符串[,安全])

像引号(),而且还用加号代替空格,按要求引用HTML表单值。 加上原来的字符串迹象转义,除非它们被包括在安全。 它还没有安全的默认为“/”。

编辑:对整个URL使用urllib.quote或urllib.quote_plus将裂伤它,@ΤΖΩΤΖΙΟΥ指出:

>>> quoted_url = urllib.quote('http://www.example.com/foo goo/bar.html')
>>> quoted_url
'http%3A//www.example.com/foo%20goo/bar.html'
>>> urllib2.urlopen(quoted_url)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\python25\lib\urllib2.py", line 124, in urlopen
    return _opener.open(url, data)
  File "c:\python25\lib\urllib2.py", line 373, in open
    protocol = req.get_type()
  File "c:\python25\lib\urllib2.py", line 244, in get_type
    raise ValueError, "unknown url type: %s" % self.__original
ValueError: unknown url type: http%3A//www.example.com/foo%20goo/bar.html

@ΤΖΩΤΖΙΟΥ提供了一个使用一个函数urlparse.urlparse和urlparse.urlunparse解析url和唯一编码的路径。 这可能对你更有用,但如果你从一个已知的协议和主机,但有一个犯罪嫌疑人路中的URL,你很可能不一样好,以避免和里urlparse只是引述URL的嫌疑人的一部分,与串联已知的安全部件。



Answer 4:

因为这个页面是关于这个专题的谷歌搜索的顶部结果,我认为这是值得一提的是,已经在使用Python URL规范化超越URL编码空格字符做了一些工作。 例如,处理默认端口,性格情况下,尾随缺少的斜线,等等。

当正在开发的Atom联合格式,有对如何规范网址为规范格式的一些讨论; 这是在文章记录PaceCanonicalIds对原子/饼维基。 这篇文章提供了一些很好的测试案例。

我相信,本次讨论的一个结果是马克诺丁汉urlnorm.py库,我已经有一对夫妇的项目良好的效果。 该脚本不会在这个问题上给出的URL但是工作。 所以,更好的选择可能是萨姆Ruby的版本urlnorm.py的 ,其处理该URL,和所有的从Atom维基上述测试用例。



Answer 5:

import urlparse, urllib
def myquote(url):
    parts= urlparse.urlparse(url)
    return urlparse.urlunparse(parts[:2] + urllib.quote(parts[2]) + parts[3:])

这仅引用路径组件。

否则,你可以这样做: urllib.quote(url, safe=":/")



Answer 6:

仅供参考,urlnorm已经转移到github上: http://gist.github.com/246089



Answer 7:

我遇到这样一个问题:只需要引用的空间。

fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]")做帮助,但它太复杂了。

所以我用一个简单的方法: url = url.replace(' ', '%20')它并不完美,但它是最简单的方法,它适用于这种情况。



Answer 8:

有效的Python 3.5:

import urllib.parse

urllib.parse.quote([your_url], "\./_-:")

例:

import urllib.parse

print(urllib.parse.quote("http://www.example.com/foo goo/bar.html", "\./_-:"))

输出将是http://www.example.com/foo%20goo/bar.html

字体: https://docs.python.org/3.5/library/urllib.parse.html?highlight=quote#urllib.parse.quote



文章来源: How can I normalize a URL in python