การดึงพารามิเตอร์จาก URL


164

กำหนด URL ดังต่อไปนี้ฉันจะแยกค่าพารามิเตอร์การสืบค้นได้อย่างไร defยกตัวอย่างเช่นในกรณีนี้ผมต้องการให้ค่าของ

/abc?def='ghi'

ฉันใช้ Django ในสภาพแวดล้อมของฉัน มีวิธีการในrequestวัตถุที่สามารถช่วยฉันได้อย่างไร

ฉันลองใช้self.request.get('def')แต่ไม่คืนค่าghiเหมือนที่ฉันหวังไว้

คำตอบ:


256

Python 2:

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

Python 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_qs ส่งคืนรายการค่าดังนั้นโค้ดด้านบนจะพิมพ์ ['ghi']ส่งกลับรายการค่าดังนั้นโค้ดข้างต้นจะพิมพ์

นี่คือเอกสาร Python 3


58
ใน python3import urllib.parse as urlparse
Ivan De Paz Centeno

26
โปรดทราบว่าparse_qsจะส่งคืนรายการวัตถุ คุณต้องได้องค์ประกอบแรกของมันถ้าคุณต้องการสตริงurlparse.parse_qs(parsed.query)['def'][0]
raffaem

3
โปรดทราบว่าหาก URL มีอักขระ '#' เช่นนี้: foo.appspot.com/#/abc?def=ghiคุณจะต้องไม่อนุญาตแฟรกเมนต์: urlparse(url, allow_fragments=False)มิฉะนั้นข้อความค้นหาจะส่งคืนสตริงว่างเปล่า
codezjx

2
ใน python3 ต้องใช้from urllib.parse import urlparse, parse_qsและparse_qs(parsed.query)
เด ธ โน้ตจักรพรรดิ

1
@FrancescoFrassinelli ใช้ได้แล้ว urlparse.urlparse(url)->urlparse(url)
Winand

55

ฉันตกใจที่โซลูชันนี้ไม่ได้อยู่ที่นี่แล้ว ใช้:

request.GET.get('variable_name')

สิ่งนี้จะ "รับ" ตัวแปรจากพจนานุกรม "GET" และส่งคืนค่า 'variable_name' หากมีอยู่หรือไม่มีวัตถุหากไม่มีอยู่


3
นี่ควรเป็นคำตอบที่ดีที่สุด ทำงานเหมือนจับใจ
muntasir2000

2
ฉันต้องออกไปselfแต่ฉันเห็นด้วยกับความคิดเห็นข้างต้น
Matt Cremeens

ฉันทำงานนี้ไม่ได้ อาจมีรายละเอียดเพิ่มเติม คุณได้รับคำขออย่างไร python3 นี้ใช้งานร่วมกันได้หรือไม่?
ggedde

3
@ggedde คำตอบนี้ (เช่นคำถาม) สำหรับ django มันเป็นวัตถุคำขอ django หากคุณไม่ได้ใช้ django ให้ใช้หนึ่งในคำตอบอื่น ๆ
Florian


46

สำหรับ 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
วิธีที่ดีที่สุดที่จะทำ IMO ไม่จำเป็นต้องมีแพ็คเกจเพิ่มเติมและใช้งาน A + กับ Python 3.5
wanaryytel

23

มีห้องสมุดใหม่ที่เรียกว่าหุบ ฉันพบว่าห้องสมุดนี้มีความสำคัญมากที่สุดในการทำพีชคณิต url ติดตั้ง:

pip install furl

รหัส:

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

3
ห้องสมุดที่ยอดเยี่ยม! ไม่ทราบเกี่ยวกับมัน แต่ใช้งานได้เหมือนมีเสน่ห์ :)
pasql

3
:) ฉันเสียเวลาพยายามที่จะทำให้ urlparse ใช้งานได้สำหรับฉัน ไม่มีอีกแล้ว
Mayank Jaiswal

18

ฉันรู้ว่ามันช้าไปหน่อย แต่เนื่องจากฉันพบว่าตัวเองอยู่ที่นี่ในวันนี้ฉันคิดว่านี่อาจเป็นคำตอบที่มีประโยชน์สำหรับผู้อื่น

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

ด้วย parse_qsl () "ข้อมูลจะถูกส่งกลับเป็นรายการของชื่อคู่ค่า"


5

url ที่คุณอ้างถึงเป็นประเภทข้อความค้นหาและฉันเห็นว่าวัตถุคำขอสนับสนุนวิธีการที่เรียกว่าอาร์กิวเมนต์เพื่อรับอาร์กิวเมนต์ของแบบสอบถาม คุณอาจต้องการลองself.request.get('def')โดยตรงเพื่อรับค่าของคุณจากวัตถุ ..




3

ไม่จำเป็นต้องทำสิ่งใด ด้วยเท่านั้น

self.request.get('variable_name')

สังเกตว่าฉันไม่ได้ระบุวิธีการ (GET, POST, ฯลฯ ) นี่เป็นเอกสารที่ดีและนี่คือตัวอย่าง

ความจริงที่ว่าคุณใช้แม่แบบ Django ไม่ได้หมายความว่าตัวจัดการจะถูกประมวลผลโดย Django เช่นกัน


3

ในงูหลามบริสุทธิ์:

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]


0

Btw ฉันมีปัญหาในการใช้ parse_qs () และรับพารามิเตอร์ค่าว่างและเรียนรู้ว่าคุณต้องผ่านพารามิเตอร์ตัวเลือกที่สอง 'keep_blank_values' เพื่อส่งกลับรายการพารามิเตอร์ในสตริงแบบสอบถามที่ไม่มีค่า มันเป็นค่าเริ่มต้นเป็นเท็จ API ที่เขียนช้า ๆ บางตัวต้องการพารามิเตอร์ที่จะแสดงแม้ว่าจะไม่มีค่าก็ตาม

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

0

มีห้องสมุดที่ดีคือ w3lib.url

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

0

พารามิเตอร์ = dict ([part.split ('=') เพื่อเป็นส่วนหนึ่งใน get_parsed_url [4] .split ('&')])

อันนี้ง่าย พารามิเตอร์ตัวแปรจะมีพจนานุกรมของพารามิเตอร์ทั้งหมด


0

ฉันเห็นว่าไม่มีคำตอบสำหรับผู้ใช้งาน Tornado:

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

วิธีนี้ต้องทำงานภายในตัวจัดการที่ได้มาจาก:

tornado.web.RequestHandler

ไม่มีคำตอบวิธีนี้จะกลับมาเมื่อไม่พบคีย์ที่ร้องขอ สิ่งนี้ช่วยคุณจัดการข้อยกเว้นบางอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.