解析 URL 查询字符串的最佳方法

问题描述 投票:0回答:6

在 python 中从 URL 查询字符串中解析数据(例如,通过表单附加到 URL 的数据)的最佳方法是什么?我的目标是接受表单数据并将其显示在同一页面上。我研究了几种并不完全是我想要的方法。

我正在创建一个简单的网络服务器,目的是学习套接字。除了测试目的之外,该网络服务器不会用于任何其他目的。

GET /?1pm=sample&2pm=&3pm=&4pm=&5pm= HTTP/1.1
Host: localhost:50000
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost:50000/?1pm=sample&2pm=&3pm=&4pm=&5pm=
python string http webserver
6个回答
111
投票

这是一个使用 python3 的示例

urllib.parse
:

from urllib.parse import urlparse, parse_qs
URL='https://someurl.com/with/query_string?i=main&mode=front&sid=12ab&enc=+Hello'
parsed_url = urlparse(URL)
parse_qs(parsed_url.query)

输出:

{'i': ['main'], 'enc': [' Hello '], 'mode': ['front'], 'sid': ['12ab']}

python2注意事项:

from urlparse import urlparse, parse_qs

参见:https://pythonhosted.org/six/#module-six.moves.urllib.parse


54
投票

urllib.parse 模块是你的朋友:https://docs.python.org/3/library/urllib.parse.html

查看 urllib.parse.parse_qs (解析查询字符串,即通过 GET 发送到服务器的表单数据或通过 POST 发布的表单数据,至少对于非多部分数据)。还有 cgi.FieldStorage 用于解释多部分数据。

要解析 HTTP 交互的其余部分,请参阅 RFC2616,这是 HTTP/1.1 协议规范。


31
投票

如果您需要查询字符串中的唯一键,请使用

dict()
parse_qsl()

import urllib.parse
urllib.parse.urlparse('https://someurl.com/with/query_string?a=1&b=2&b=3').query
    a=1&b=2&b=3
urllib.parse.parse_qs('a=1&b=2&b=3');
    {'a': ['1'], 'b': ['2','3']}
urllib.parse.parse_qsl('a=1&b=2&b=3')
    [('a', '1'), ('b', '2'), ('b', '3')]
dict(urllib.parse.parse_qsl('a=1&b=2&b=3'))
    {'a': '1', 'b': '3'}

8
投票

内置于Python 2.7

>>> from urlparse import parse_qs
>>> parse_qs("search=quint&tags=python")
{'search': ['quint'], 'tags': ['python']}

2
投票

仅适用于无需导入的一行快速原型 CGI 变量,显然不是最好的,但可能很有用。

agrs = dict(item.split('=') for item in env['QUERY_STRING'].split('&') if item)

0
投票

只需检查 liburlparser,我知道这是用 C++ 编写的最快的解决方案。

pip install liburlparser

然后这样做:

from liburlparser import Url
url = Url("https://someurl.com/with/query_string?a=1&b=2&b=3")
print(url.params)
print(dict([p.split("=") for p in url.params]))
© www.soinside.com 2019 - 2024. All rights reserved.