2012-04-11 40 views
32

Cách tốt nhất để phân tích cú pháp dữ liệu ra khỏi chuỗi truy vấn URL (ví dụ: dữ liệu được thêm vào URL theo biểu mẫu) trong python là gì? Mục tiêu của tôi là chấp nhận dữ liệu biểu mẫu và hiển thị nó trên cùng một trang. Tôi đã nghiên cứu một số phương pháp mà không phải là những gì tôi đang tìm kiếm.Cách tốt nhất để phân tích chuỗi truy vấn URL

Tôi đang tạo một máy chủ web đơn giản với mục tiêu tìm hiểu về ổ cắm. Máy chủ web này sẽ không được sử dụng cho bất kỳ mục đích nào ngoài mục đích thử nghiệm.

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

Bạn có l ooking để viết các phân tích cú pháp từ đầu, hoặc những gì? – Marcin

+2

Có vấn đề gì với http://stackoverflow.com/questions/1349367/parse-an-http-request-authorization-header-with-python hoặc http://stackoverflow.com/questions/4685217/parse-raw-http- tiêu đề. Bạn đã không cho chúng tôi đủ thông tin về những cách tiếp cận khác đang thiếu. Bạn có một ví dụ tiêu đề hoặc hai? –

+0

Không có gì là 'sai' với một trong các bài đăng này. Dựa trên những kinh nghiệm lập trình tôi đã từng làm trong quá khứ, tôi có khuynh hướng làm một cái gì đó tương tự như biểu thức regex trong liên kết thứ hai. Tuy nhiên, tôi muốn hỏi xem có cách nào đơn giản hơn không vì đây là chương trình python đầu tiên của tôi. – egoskeptical

Trả lời

41

Module urllib.parse là bạn của bạn: https://docs.python.org/3/library/urllib.parse.html

Check-out urllib.parse.parse_qs (phân tích cú pháp truy vấn-string, tức là dữ liệu mẫu gửi đến máy chủ bằng cách GET hoặc dạng dữ liệu gửi qua đường bưu điện, ít nhất là cho những người không -multipart data). Ngoài ra còn có cgi.FieldStorage để diễn giải đa dữ liệu.

Để phân tích cú pháp phần còn lại của tương tác HTTP, hãy xem RFC2616, là thông số giao thức HTTP/1.1.

+1

Điều này là tốt, nhưng không có gì giống như một giải pháp hoàn chỉnh. – Marcin

+1

Tôi không viết kịch bản cho anh ấy. Ông đặc biệt hỏi làm thế nào để phân tích dữ liệu truy vấn, ít nhất đó là những gì tôi đọc giữa các dòng, mặc dù những người không thực sự là tiêu đề HTTP. Nhưng tôi không bận tâm về điều đó. – modelnine

+0

Tôi không đề nghị bạn nên viết kịch bản cho anh ấy, nhưng urlparse chỉ là một phần nhỏ của câu đố này. – Marcin

12

Dưới đây là một ví dụ sử dụng 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']} 

Lưu ý cho python2: from urlparse import urlparse, parse_qs

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

+0

Và tại sao các giá trị như thế này '' '['value']' ''? '' 'dic ['enc']' '' nhận '' '['Xin chào']' '' - làm thế nào để có được 'Xin chào'? với chia tay? – Suisse

+0

@Suisse xem https://stackoverflow.com/questions/11447391/ajax-why-jquery-replaces-with-a-space các giá trị nằm trong danh sách vì nhiều giá trị có thể được mã hóa xem: https://stackoverflow.com/question/2571145/urlencode-an-array-of-giá trị hy vọng nó sẽ giúp – jmunsch

1

Nếu bạn cần khóa duy nhất từ ​​chuỗi truy vấn, sử dụng dict() với 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'} 
Các vấn đề liên quan