gpt4 book ai didi

Python urlparse.parse_qs unicode url

转载 作者:太空狗 更新时间:2023-10-29 17:06:20 24 4
gpt4 key购买 nike

urlparse.parse_qs 对于解析 url 参数很有用,它可以很好地处理简单的 ASCII url,用 str 表示。所以我可以解析一个查询,然后使用 urllib.urlencode 从解析的数据中构建相同的路径:

>>> import urlparse
>>> import urllib
>>>
>>> path = '/?key=value' #path is str
>>> query = urlparse.urlparse(path).query
>>> query
'key=value'
>>> query_dict = urlparse.parse_qs(query)
>>> query_dict
{'key': ['value']}
>>> '/?' + urllib.urlencode(query_dict, doseq=True)
'/?key=value' # <-- path is the same here

它也可以正常工作,当 url 包含百分比编码的非 ASCII 参数时:

>>> value = urllib.quote(u'значение'.encode('utf8'))
>>> value
'%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5'
>>> path = '/?key=%s' % value
>>> path
'/?key=%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5'
>>> query = urlparse.urlparse(path).query
>>> query
'key=%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5'
>>> query_dict = urlparse.parse_qs(query)
>>> query_dict
{'key': ['\xd0\xb7\xd0\xbd\xd0\xb0\xd1\x87\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5']}

>>> '/?' + urllib.urlencode(query_dict, doseq=True)
'/?key=%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5' # <-- path is the same here

但是,当使用 django 时,我使用 request.get_full_path() 获取 url,并将路径作为 unicode 字符串返回:

>>> path = request.get_full_path()
>>> path
u'/?key=%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5' # path is unicode

看看现在会发生什么:

>>> query = urlparse.urlparse(path).query
>>> query
u'key=%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5'
>>> query_dict = urlparse.parse_qs(query)
>>> query_dict
{u'key': [u'\xd0\xb7\xd0\xbd\xd0\xb0\xd1\x87\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5']}
>>>

query_dict 包含 unicode 字符串,包含字节!不是unicode点!当然,在尝试对该字符串进行 urlencode 时,我遇到了 UnicodeEncodeError:

>>> urllib.urlencode(query_dict, doseq=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\Lib\urllib.py", line 1337, in urlencode
l.append(k + '=' + quote_plus(str(elt)))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-15: ordinal not in range(128)

目前我有一个解决方案:

# just convert path, returned by request.get_full_path(), to `str` explicitly:
path = str(request.get_full_path())

所以问题是:

  • 为什么 parse_qs 返回如此奇怪的字符串(unicode,包含字节)?
  • 将 url 转换为 str 是否安全?

最佳答案

在将它传递给 .parse_qs() 之前, 使用 ASCII 编码回字节:

query_dict = urlparse.parse_qs(query.encode('ASCII'))

这与 str() 的作用相同,但使用显式编码。是的,这是安全的,URL 编码使用 ASCII 代码点。

parse_qs 被传递给一个 Unicode 值,所以它也返回给你一个 unicode 值;解码字节不是它的工作。

关于Python urlparse.parse_qs unicode url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16614695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com