Lấy tham số từ một URL


164

Đưa ra một URL như sau, làm cách nào tôi có thể phân tích giá trị của các tham số truy vấn? Ví dụ, trong trường hợp này tôi muốn giá trị của def.

/abc?def='ghi'

Tôi đang sử dụng Django trong môi trường của tôi; Có một phương pháp trên requestđối tượng có thể giúp tôi?

Tôi đã thử sử dụng self.request.get('def')nhưng nó không trả lại giá trị ghinhư tôi mong đợi.

Câu trả lời:


255

Con trăn 2:

import urlparse
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print urlparse.parse_qs(parsed.query)['def']

Con trăn 3:

import urllib.parse as urlparse
from urllib.parse import parse_qs
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print(parse_qs(parsed.query)['def'])

parse_qstrả về một danh sách các giá trị, vì vậy đoạn mã trên sẽ in ra ['ghi'].

Đây là tài liệu Python 3.


58
Trong python3import urllib.parse as urlparse
Ivan De Paz Centeno

26
Lưu ý rằng parse_qssẽ trả về cho bạn một đối tượng danh sách. Bạn cần lấy phần tử đầu tiên của nó nếu bạn muốn một chuỗiurlparse.parse_qs(parsed.query)['def'][0]
raffaem

3
Lưu ý rằng nếu url chứa ký tự '#' như thế này: foo.appspot.com/#/abc?def=ghi , bạn phải không cho phép các đoạn: urlparse(url, allow_fragments=False)nếu không, truy vấn sẽ trả về str trống.
codezjx

2
trong python3, phải sử dụng from urllib.parse import urlparse, parse_qsparse_qs(parsed.query)
deathemaoh

1
@FrancescoFrassinelli là hợp lệ. urlparse.urlparse(url)->urlparse(url)
Winand

55

Tôi bị sốc vì giải pháp này không có ở đây. Sử dụng:

request.GET.get('variable_name')

Điều này sẽ "lấy" biến từ từ điển "GET" và trả về giá trị 'biến_name' nếu nó tồn tại hoặc một đối tượng Không có nếu nó không tồn tại.


3
Đây phải là câu trả lời hàng đầu. Hoạt động như một lá bùa.
muntasir2000

2
Tôi đã phải rời đi self, nhưng tôi đồng ý với nhận xét trên.
Matt Cremeens

Tôi không thể làm việc này. Có thể một số chi tiết. Làm thế nào bạn nhận được yêu cầu? Đây có phải là python3 tương thích?
ggedde

3
@ggedde câu trả lời này (giống như câu hỏi) dành cho django, nó là một đối tượng yêu cầu django. nếu bạn không sử dụng django, hãy sử dụng một trong những câu trả lời khác.
Florian

55
import urlparse
url = 'http://example.com/?q=abc&p=123'
par = urlparse.parse_qs(urlparse.urlparse(url).query)

print par['q'][0], par['p'][0]

46

cho Python> 3,4

from urllib import parse
url = 'http://foo.appspot.com/abc?def=ghi'
query_def=parse.parse_qs(parse.urlparse(url).query)['def'][0]

4
Cách tốt nhất để làm điều đó IMO. Không cần các gói bổ sung và hoạt động A + trên Python 3.5.
wanaryytel

22

Có một thư viện mới gọi là furl. Tôi thấy thư viện này là hầu hết các pythonic để làm đại số url. Để cài đặt:

pip install furl

Mã số:

from furl import furl
f = furl("/abc?def='ghi'") 
print f.args['def']

3
Thư viện tuyệt vời! Không biết về nó nhưng hoạt động như một bùa mê :)
pasql

3
:) Tôi đã lãng phí thời gian để cố gắng làm cho urlparse hoạt động cho tôi. Không còn nữa.
Mayank Jaiswal

18

Tôi biết điều này hơi muộn nhưng vì tôi thấy mình ở đây hôm nay, tôi nghĩ rằng đây có thể là một câu trả lời hữu ích cho những người khác.

import urlparse
url = 'http://example.com/?q=abc&p=123'
parsed = urlparse.urlparse(url)
params = urlparse.parse_qsl(parsed.query)
for x,y in params:
    print "Parameter = "+x,"Value = "+y

Với parse_qsl (), "Dữ liệu được trả về dưới dạng danh sách các cặp tên, giá trị".


5

Url mà bạn đang đề cập là một loại truy vấn và tôi thấy rằng đối tượng yêu cầu hỗ trợ một phương thức gọi là đối số để lấy các đối số truy vấn. Bạn cũng có thể muốn thử self.request.get('def')trực tiếp để lấy giá trị của mình từ đối tượng ..


3
def getParams(url):
    params = url.split("?")[1]
    params = params.split('=')
    pairs = zip(params[0::2], params[1::2])
    answer = dict((k,v) for k,v in pairs)

Hi vọng điêu nay co ich


Điều này không cần thiết trong một ứng dụng web.
Nick Johnson


3

Không cần phải làm điều đó. Chỉ với

self.request.get('variable_name')

Lưu ý rằng tôi không chỉ định phương thức (GET, POST, v.v.). Đây là tài liệu tốtđây là một ví dụ

Việc bạn sử dụng các mẫu Django không có nghĩa là trình xử lý cũng được xử lý bởi Django


3

Trong Python thuần túy:

def get_param_from_url(url, param_name):
    return [i.split("=")[-1] for i in url.split("?", 1)[-1].split("&") if i.startswith(param_name + "=")][0]

2
import cgitb
cgitb.enable()

import cgi
print "Content-Type: text/plain;charset=utf-8"
print
form = cgi.FieldStorage()
i = int(form.getvalue('a'))+int(form.getvalue('b'))
print i

0

Btw, tôi đã gặp vấn đề khi sử dụng parse_qs () và nhận các tham số giá trị trống và học được rằng bạn phải truyền tham số tùy chọn thứ hai 'keepetric_values' để trả về danh sách các tham số trong chuỗi truy vấn không chứa giá trị. Nó mặc định là sai. Một số API bằng văn bản nhảm nhí yêu cầu phải có các tham số ngay cả khi chúng không chứa giá trị

for k,v in urlparse.parse_qs(p.query, True).items():
  print k

0

Có một thư viện đẹp w3lib.url

from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi

0

tham số = dict ([part.split ('=') cho một phần trong get_parsed_url [4] .split ('&')])

Điều này là đơn giản. Các tham số biến sẽ chứa một từ điển của tất cả các tham số.


0

Tôi thấy không có câu trả lời cho người dùng Tornado:

key = self.request.query_arguments.get("key", None)

Phương pháp này phải hoạt động bên trong một trình xử lý có nguồn gốc từ:

tornado.web.RequestHandler

Không có câu trả lời mà phương thức này sẽ trả về khi không thể tìm thấy khóa được yêu cầu. Điều này giúp bạn tiết kiệm một số xử lý ngoại lệ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.