我想知道我是否在python中标准化URL。
例如,如果我有一个网址字符串,例如:“ http://www.example.com/foo goo / bar.html”
我需要python中的库,该库会将多余的空间(或任何其他非标准化字符)转换为正确的URL。
我想知道我是否在python中标准化URL。
例如,如果我有一个网址字符串,例如:“ http://www.example.com/foo goo / bar.html”
我需要python中的库,该库会将多余的空间(或任何其他非标准化字符)转换为正确的URL。
Answers:
看一下这个模块:werkzeug.utils。(现在在werkzeug.urls
)
您要查找的函数称为“ url_fix”,其工作方式如下:
>>> from werkzeug.urls import 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))
url_fix
现在位于werkzeug.urls
正确的解决方案是:
# percent encode url, fixing lame server errors for e.g, like space
# within url paths.
fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]")
有关更多信息,请参见Issue918368:“ urllib无法更正服务器返回的URL”
import urllib
调用urllib.quote()
。
采用 urllib.quote
或urllib.quote_plus
quote(string [,safe])
使用“%xx”转义符替换字符串中的特殊字符。字母,数字和字符“ _.-”都不会被引用。可选的safe参数指定不应加引号的其他字符-其默认值为'/'。
示例:
quote('/~connolly/')
yields'/%7econnolly/'
。quote_plus(字符串[,安全])
像quote()一样,但是也用加号代替空格,这是引用HTML表单值所必需的。除非原始字符串中包含加号,否则它们将被转义。它也没有安全的默认值'/'。
编辑:在整个URL上使用urllib.quote或urllib.quote_plus会使其混乱,如@@ΤZΩΤZΙΟΥ指出:
>>> 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的可疑部分,并与已知的安全零件。
因为此页面是Google在该主题上搜索的最佳结果,所以我认为值得一提的是使用Python对URL规范化所做的一些工作,这些工作超出了对数字字符的黑字编码。例如,处理默认端口,字符大小写,缺少尾部斜杠等。
在开发Atom联合格式时,有人在讨论如何将URL规范化为规范格式。这在文章PaceCanonicalIds中有记录在Atom / Pie Wiki上的进行了记录。那篇文章提供了一些很好的测试案例。
我相信,这次讨论的结果是Mark Nottingham的urlnorm.py库,我在几个项目中都用到了很好的结果。但是,该脚本不适用于此问题中给出的URL。因此,一个更好的选择可能是Sam Ruby的urlnorm.py版本,该版本可以处理该URL以及Atom Wiki中的所有上述测试用例。
from urllib.parse import urlparse, urlunparse, quote
def myquote(url):
parts = urlparse(url)
return urlunparse(parts._replace(path=quote(parts.path)))
>>> myquote('https://www.example.com/~user/with space/index.html?a=1&b=2')
'https://www.example.com/~user/with%20space/index.html?a=1&b=2'
import urlparse, urllib
def myquote(url):
parts = urlparse.urlparse(url)
return urlparse.urlunparse(parts[:2] + (urllib.quote(parts[2]),) + parts[3:])
>>> myquote('https://www.example.com/~user/with space/index.html?a=1&b=2')
'https://www.example.com/%7Euser/with%20space/index.html?a=1&b=2'
这仅引用路径组件。
适用于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