urllib.quote()抛出KeyError异常(urllib.quote() throws K

2019-07-20 15:31发布

为了编码的URI中,我使用urllib.quote("schönefeld")但是当一些非ASCII字符在字符串存在,则thorws

KeyError: u'\xe9'
Code: return ''.join(map(quoter, s))

我的输入字符串是köln, brønshøj, schönefeld等。

当我试图只是印刷在窗口语句(使用python2.7,pyscripter IDE)。 但在linux下它会引发异常(我猜平台并不重要)。

这就是我想:

from commands import getstatusoutput
queryParams = "schönefeld";
cmdString = "http://baseurl" + quote(queryParams)
print getstatusoutput(cmdString)

探索问题的原因:urllib.quote()实际上是被肆意的异常return ''.join(map(quoter, s))

urllib中的代码是:

def quote(s, safe='/'):
    if not s:
        if s is None:
            raise TypeError('None object cannot be quoted')
        return s
     cachekey = (safe, always_safe)
     try:
         (quoter, safe) = _safe_quoters[cachekey]
     except KeyError:
         safe_map = _safe_map.copy()
         safe_map.update([(c, c) for c in safe])
         quoter = safe_map.__getitem__
         safe = always_safe + safe
         _safe_quoters[cachekey] = (quoter, safe)
      if not s.rstrip(safe):
         return s
      return ''.join(map(quoter, s))

之所以例外是''.join(map(quoter, s))用于以s的每一个元素,加引号的功能将被调用,最终名单将被加入'并返回。

非ASCII字符è ,等效关键将是%E8其呈现在_safe_map变量。 但是,当我打电话引号(“E”),它将搜索键\xe8 。 所以,关键不存在,并抛出异常。

所以,我只是体改s = [el.upper().replace("\\X","%") for el in s]之前调用''.join(map(quoter, s))内try-except块。 现在,它工作正常。

但我讨厌什么,我所做的是正确的做法或会造成任何其他问题? 同时,我也对Linux有200多个实例,这是非常艰难的在所有情况下,部署此修复程序。

Answer 1:

您正在试图引用Unicode数据,所以你需要决定如何将其转换成URL安全字节。

编码第一个字节的字符串。 UTF-8通常用于:

>>> import urllib
>>> urllib.quote(u'sch\xe9nefeld')
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py:1268: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
  return ''.join(map(quoter, s))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 1268, in quote
    return ''.join(map(quoter, s))
KeyError: u'\xe9'
>>> urllib.quote(u'sch\xe9nefeld'.encode('utf8'))
'sch%C3%A9nefeld'

然而,编码取决于什么服务器会接受 。 它最好是坚持原来的形态与发送的编码。



Answer 2:

仅由字符串转换为Unicode我解决了问题。

这里是片段:

try:
    unicode(mystring, "ascii")
except UnicodeError:
    mystring = unicode(mystring, "utf-8")
else:
    pass

的溶液的详细描述可以被发现在http://effbot.org/pyfaq/what-does-unicodeerror-ascii-decoding-encoding-error-ordinal-not-in-range-128-mean.htm



Answer 3:

我有完全相同的错误作为@underscore但对我来说,问题是地图(加引号,S)试图寻找钥匙u'\xe9'这是不是在_safe_map 。 然而\xe9了,所以我通过更换解决这个问题u'\xe9'\xe9s

此外,不应该的return声明是中try/except ? 我也不得不更改为彻底解决问题。



文章来源: urllib.quote() throws KeyError