พารามิเตอร์การสืบค้น URL เพื่อกำหนด python


105

มีวิธีแยกวิเคราะห์ URL (ด้วยไลบรารี python บางตัว) และส่งคืนพจนานุกรม python พร้อมกับคีย์และค่าของพารามิเตอร์การสืบค้นส่วนหนึ่งของ URL หรือไม่

ตัวอย่างเช่น:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

ผลตอบแทนที่คาด:

{'ct':32, 'op':92, 'item':98}

คำตอบ:


201

ใช้urllib.parseห้องสมุด :

>>> from urllib import parse
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> parse.urlsplit(url)
SplitResult(scheme='http', netloc='www.example.org', path='/default.html', query='ct=32&op=92&item=98', fragment='')
>>> parse.parse_qs(parse.urlsplit(url).query)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(parse.parse_qsl(parse.urlsplit(url).query))
{'item': '98', 'op': '92', 'ct': '32'}

urllib.parse.parse_qs()และurllib.parse.parse_qsl()วิธีการแยกออกสตริงแบบสอบถามคำนึงถึงว่ากุญแจสามารถเกิดขึ้นได้มากกว่าหนึ่งครั้งและคำสั่งที่อาจสำคัญ

หากคุณยังคงอยู่บนงูหลาม 2 ถูกเรียกว่าurllib.parseurlparse


40

สำหรับ Python 3 ค่าของ dict from parse_qsจะอยู่ในรายการเนื่องจากอาจมีหลายค่า หากคุณต้องการเพียงอันแรก:

>>> from urllib.parse import urlsplit, parse_qs
>>>
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> query = urlsplit(url).query
>>> params = parse_qs(query)
>>> params
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(params)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> {k: v[0] for k, v in params.items()}
{'item': '98', 'op': '92', 'ct': '32'}

1
สิ่งนี้ไม่ซ้ำกับ Python 3 แต่ Python 2 urllib.parse_qsยังส่งคืนรายการสำหรับค่า ฉันพูดถึงสิ่งนี้โดยเฉพาะในคำตอบของฉันคุณอาจต้องการใช้urllib.parse_qsl()แทนและวางรายการผลลัพธ์ไปdict()หากคุณต้องการเพียงค่าเดียว
Martijn Pieters

ดูเหมือนว่าแตกต่างกับparse_qlsเป็นว่าตั้งแต่มันกลับรายการของสิ่งอันดับที่แปลงที่จะ Dict จะให้ที่ผ่านมามีมูลค่าแทนครั้งแรก แน่นอนว่าสิ่งนี้ถือว่ามีหลายค่าที่จะเริ่มต้นด้วย
reubano

11

หากคุณไม่ต้องการใช้โปรแกรมแยกวิเคราะห์:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"
url = url.split("?")[1]
dict = {x[0] : x[1] for x in [x.split("=") for x in url[1:].split("&") ]}

ดังนั้นฉันจะไม่ลบสิ่งที่อยู่ด้านบน แต่ไม่ใช่สิ่งที่คุณควรใช้อย่างแน่นอน

ฉันคิดว่าฉันอ่านคำตอบสองสามคำและมันดูซับซ้อนเล็กน้อยในกรณีที่คุณเป็นเหมือนฉันอย่าใช้วิธีแก้ปัญหาของฉัน

ใช้สิ่งนี้:

from urllib import parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

และสำหรับ Python 2.X

import urlparse as parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

ฉันรู้ว่านี่เหมือนกับคำตอบที่ยอมรับเพียงในซับเดียวที่สามารถคัดลอกได้


8
การแยกวิเคราะห์เกี่ยวข้องมากกว่าการแยกสตริง คุณต้องจัดการการเข้ารหัส URL (รวมถึง+) และurllib.parseยังเพิ่มหรือละเว้นข้อผิดพลาดให้คุณตามที่ร้องขอ ฉันไม่แน่ใจว่าทำไมคุณถึงต้องการสร้างวงล้อนี้ขึ้นมาใหม่เมื่อเป็นส่วนหนึ่งของไลบรารีมาตรฐาน
Martijn Pieters

6

สำหรับ python 2.7.2

In [14]: url = "http://www.example.org/default.html?ct=32&op=92&item=98"

In [15]: from urlparse import urlparse, parse_qsl

In [16]: parse_url = urlparse(url)

In [17]: query_dict = dict(parse_qsl(parse_url.query))

In [18]: query_dict
Out[18]: {'ct': '32', 'item': '98', 'op': '92'}

5

ฉันเห็นด้วยกับการไม่คิดค้นล้อใหม่ แต่บางครั้ง (ในขณะที่คุณกำลังเรียนรู้) มันช่วยในการสร้างวงล้อเพื่อที่จะเข้าใจวงล้อ :) ดังนั้นจากมุมมองของนักวิชาการอย่างแท้จริงฉันขอเสนอสิ่งนี้โดยมีข้อแม้ว่าการใช้พจนานุกรมถือว่าคู่ค่าของชื่อไม่ซ้ำกัน (สตริงการสืบค้นไม่มีหลายระเบียน)

url = 'http:/mypage.html?one=1&two=2&three=3'

page, query = url.split('?')

names_values_dict = dict(pair.split('=') for pair in query.split('&'))

names_values_list = [pair.split('=') for pair in query.split('&')]

ฉันใช้เวอร์ชัน 3.6.5 ใน Idle IDE


0

สำหรับpython2.7ฉันกำลังใช้urlparseโมดูลเพื่อแยกวิเคราะห์แบบสอบถาม url เพื่อเขียนตามคำบอก

import urlparse

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

print urlparse.parse_qs( urlparse.urlparse(url).query )
# result: {'item': ['98'], 'op': ['92'], 'ct': ['32']} 

มีวิธีที่จะไม่สร้าง url เดิมขึ้นมาใหม่โดยพูดเพียงแค่ลบรายการออก
John Constantine

0

คุณสามารถแยกวิเคราะห์ URL ได้อย่างง่ายดายด้วยไลบรารีเฉพาะ

นี่คือรหัสง่ายๆของฉันในการแยกวิเคราะห์โดยไม่ต้องมีไลบรารีเฉพาะ

(URL ที่ป้อนต้องมีชื่อโดเมนโปรโตคอลและเส้นทาง

def parseURL (url):

seg2 = url.split('/')[2]    # Separating domain name
seg1 = url.split(seg2)[-2]  # Deriving protocol
print('Protocol:', seg1, '\n')
print('Domain name:', seg2, '\n')
seg3 = url.split(seg2)[1]   #Getting the path; if output is empty,the there is no path in URL
print('Path:', seg3, '\n')

if '#' in url:  # Extracting fragment id, else None
    seg4 = url.split('#')[1]
    print('Fragment ID:', seg4, '\n')
else:
    seg4 = 'None'
if '@' in url:              # Extracting user name, else None
    seg5 = url.split('/')[-1]
    print('Scheme with User Name:', seg5, '\n')
else:
    seg5 = 'None'
if '?' in url:              # Extracting query string, else None
    seg6 = url.split('?')[-1]
    print('Query string:', seg6, '\n')
else:
    seg6 = 'None'

print('**The dictionary is in the sequence: 0.URL 1.Protocol 2.Domain name 3.Path 4.Fragment id 5.User name 6.Query string** \n')

dictionary = {'0.URL': url, '1.Protocol': seg1, '2.Domain name': seg2, '3.Path': seg3, '4.Fragment id': seg4,
              '5.User name': seg5, '6.Query string': seg6}  # Printing required dictionary
print(dictionary, '\n')

print('The TLD in the given URL is following: ')
if '.com' in url:           # Extracting most famous TLDs maintained by ICAAN
    print('.com\n')
elif '.de' in url:
    print('.de\n')
elif '.uk' in url:
    print('.uk\n')
elif 'gov' in url:
    print('gov\n')
elif '.org' in url:
    print('.org\n')
elif '.ru' in url:
    print('.ru\n')
elif '.net' in url:
    print('.net\n')
elif '.info' in url:
    print('.info\n')
elif '.biz' in url:
    print('.biz\n')
elif '.online' in url:
    print('.online\n')
elif '.in' in url:
    print('.in\n')
elif '.edu' in url:
    print('.edu\n')
else:
    print('Other low level domain!\n')

return dictionary

if name == ' main ': url = input ("Enter your URL:") parseURL (url)

#Sample URLS to copy
# url='https://www.facebook.com/photo.php?fbid=2068026323275211&set=a.269104153167446&type=3&theater'   
# url='http://www.blog.google.uk:1000/path/to/myfile.html?key1=value1&key2=value2#InTheDocument'      
# url='https://www.overleaf.com/9565720ckjijuhzpbccsd#/347876331/' 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.