Misalkan saya diberi URL.
Ini mungkin sudah memiliki parameter GET (misalnya http://example.com/search?q=question
) atau mungkin tidak (misalnya http://example.com/
).
Dan sekarang saya perlu menambahkan beberapa parameter seperti itu {'lang':'en','tag':'python'}
. Dalam kasus pertama saya akan memiliki http://example.com/search?q=question&lang=en&tag=python
dan yang kedua - http://example.com/search?lang=en&tag=python
.
Apakah ada cara standar untuk melakukan ini?
urlparse.parse_qs
bukanparse_qsl
. Yang terakhir mengembalikan daftar sedangkan Anda menginginkan dikt. Lihat docs.python.org/library/urlparse.html#urlparse.parse_qs .urlencode
sebagaiurllib.urlencode(query, doseq=True)
. Jika tidak, parameter yang ada di url asli tidak disimpan dengan benar (karena dikembalikan sebagai tupel dari @ parse_qs @urlparse()
danurlsplit()
sebenarnya adalahnamedtuple
contoh. Dengan demikian Anda dapat menetapkannya langsung ke variabel dan menggunakannyaurl_parts = url_parts._replace(query = …)
untuk memperbaruinya.Mengapa
Saya belum puas dengan semua solusi di halaman ini ( ayolah, di mana hal salin-tempel favorit kami? ) Jadi saya menulis sendiri berdasarkan jawaban di sini. Ia mencoba untuk menjadi lengkap dan lebih Pythonic. Saya telah menambahkan penangan untuk nilai dict dan bool dalam argumen agar lebih bersahabat dengan sisi konsumen ( JS ), tetapi mereka masih opsional, Anda dapat melepaskannya.
Bagaimana itu bekerja
Tes 1: Menambahkan argumen baru, menangani nilai Array dan Bool:
Tes 2: Menulis ulang argumen yang ada, menangani nilai DICT:
Berbicara itu murah. Tunjukkan kodenya.
Kode itu sendiri. Saya sudah mencoba menjelaskannya secara rinci:
Perlu diketahui bahwa mungkin ada beberapa masalah, jika Anda akan menemukannya, beri tahu saya dan kami akan membuatnya lebih baik
sumber
http://stackoverflow.com/with%2Fencoded?data=some&data=values&answe%2rs=false
. Juga, gunakan tiga>>>
tanda pangkat untuk membantu doctests mengambil doctests Andaparsed_get_args = dict(parse_qsl(get_args))
keparsed_get_args = parse_qs(get_args)
Anda ingin menggunakan pengkodean URL jika string dapat memiliki data arbitrer (misalnya, karakter seperti ampersand, garis miring, dll. Perlu dienkode).
Lihat urllib.urlencode:
Di python3:
sumber
Anda juga dapat menggunakan modul furl https://github.com/gruns/furl
sumber
Mengalihdayakannya ke perpustakaan permintaan yang diuji pertempuran .
Beginilah cara saya melakukannya:
sumber
Jika Anda menggunakan permintaan lib :
sumber
Ya: gunakan urllib .
Dari contoh di dokumentasi:
sumber
Berdasarkan jawaban ini , satu baris untuk kasus sederhana (kode Python 3):
atau:
sumber
?
di jangkar (#?stuff
).Menurut saya ini lebih elegan daripada dua jawaban teratas:
Hal terpenting yang saya tidak suka di jawaban teratas (bagaimanapun juga bagus):
query
ada di komponen URLParseResult
Yang buruk tentang tanggapan saya adalah
dict
penggabungan yang tampak ajaib menggunakan pembongkaran, tetapi saya lebih suka memperbarui kamus yang sudah ada karena prasangka saya terhadap mutabilitas.sumber
Saya menyukai versi Łukasz, tetapi karena fungsi urllib dan urllparse agak canggung untuk digunakan dalam kasus ini, menurut saya akan lebih mudah untuk melakukan sesuatu seperti ini:
sumber
Gunakan berbagai
urlparse
fungsi untuk membongkar URL yang ada,urllib.urlencode()
pada kamus gabungan, laluurlparse.urlunparse()
menyatukannya kembali.Atau ambil saja hasilnya
urllib.urlencode()
dan gabungkan ke URL dengan tepat.sumber
Namun jawaban lain:
sumber
Inilah cara saya menerapkannya.
Bekerja seperti pesona. Namun, saya menginginkan cara yang lebih bersih untuk menerapkan ini.
Cara lain untuk menerapkan hal di atas adalah memasukkannya ke dalam metode.
sumber
Dalam python 2.5
sumber