Лучший способ анализа строки запроса URL
Каков наилучший способ анализа данных из строки запроса URL (например, данные, добавленные к URL-адресу по форме) в python? Моя цель - принять данные формы и отобразить ее на одной странице. Я исследовал несколько методов, которые не совсем то, что я ищу.
Я создаю простой веб-сервер с целью узнать о сокетах. Этот веб-сервер не будет использоваться ни для чего, кроме целей тестирования.
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=
Ответы
Ответ 1
Модуль urllib.parse - ваш друг: https://docs.python.org/3/library/urllib.parse.html
Откажитесь от urllib.parse.parse_qs (разбор строки запроса, т.е. данные формы, отправленные на сервер с помощью GET или данных формы, отправленных POST, на по крайней мере, для не-многочастных данных). Там также cgi.FieldStorage для интерпретации многочастных данных.
Для анализа остальной части HTTP-взаимодействия см. RFC2616, которая является спецификацией протокола HTTP/1.1.
Ответ 2
Вот пример использования 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
Ответ 3
Если вам нужен уникальный ключ из строки запроса, используйте 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'}
Ответ 4
встроенный в питон 2.7
>>> from urlparse import parse_qs
>>> parse_qs("search=quint&tags=python")
{'search': ['quint'], 'tags': ['python']}