2012-04-11 115 views
32

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

我正在创建一个简单的Web服务器,以了解有关套接字的知识。这个网络服务器不会用于任何测试目的。

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= 
+0

你是l从头开始编写解析,或者是什么? – Marcin 2012-04-11 20:11:52

+2

什么是错的http://stackoverflow.com/questions/1349367/parse-an-http-request-authorization-header-with-python或http://stackoverflow.com/questions/4685217/parse-raw-http-头。你还没有给我们足够的信息,说明缺少其他方法。你有一个头或两个例子吗? – 2012-04-11 20:12:15

+0

这些帖子中没有任何一个是错误的。根据我过去所掌握的编程经验,我倾向于在第二个环节中做类似正则表达式的事情。但是,我想问一下,看看是否有更简单的方法来做到这一点,因为这是我的第一个Python程序。 – egoskeptical 2012-04-11 20:24:30

回答

41

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

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

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

+1

这很好,但没有像完整的解决方案。 – Marcin 2012-04-11 20:12:42

+1

我不会为他写剧本。他特别询问了如何解析查询数据,至少这就是我在各行之间阅读的内容,即使这些内容实际上并不是HTTP标头。但是我没有为此评论。 – modelnine 2012-04-11 20:14:32

+0

我并不是建议你为他写脚本,但urlparse只是这个难题的一小部分。 – Marcin 2012-04-11 20:19:17

12

下面是使用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

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

+0

为什么像这样的值''['value']'''? '''dic ['enc']'''获取'''['Hello']'''如何获得'Hello'?与拆分? – Suisse 2017-07-17 01:36:33

+0

@Suisse请参阅https://stackoverflow.com/questions/11447391/ajax-why-jquery-replaces-with-a-space这些值在列表中,因为可以编码多个值,请参阅:https://stackoverflow.com/questions/2571145/urlencode-an-array-of-values希望它有帮助 – jmunsch 2017-07-18 20:47:30

1

如果您需要查询字符串唯一密钥,使用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'} 
相关问题