Bagaimana kami menggunakan urljoindengan 3 atau parameter mode atau pustaka mana yang Anda rekomendasikan untuk ini?
Mesut Tasci
@mesuutt mencoba membuat loop dan menggabungkan setiap bagian dengan URL yang telah digabungkan sebelumnya.
Cédric Julien
2
@ CédricJulien: loop sederhana tidak akan berfungsi, karena jalur apa pun dengan awalan /akan "mereset" dan mengembalikan skema + netloc + lasturl:urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
MestreLion
Jika menggunakan urljoin, ada masalah. Misalnya, urljoin('http://www.a.com/', '../../b/c.png')hasilnya adalah 'http://www.a.com/../../b/c.png', tetapi tidak http://www.a.com/b/c.png. Jadi, apakah ada metode untuk mendapatkannya http://www.a.com/b/c.png?
bigwind
1
Tautan ke dokumentasi Python 3 mengarah ke dokumentasi Python 2, perlu diperbarui dalam jawaban, itu adalah docs.python.org/3.6/library/…
Harsh
8
Jika jalur relatif Anda terdiri dari beberapa bagian, Anda harus menggabungkannya secara terpisah, karena urljoinakan menggantikan jalur relatif, bukan menggabungkannya. Cara termudah untuk melakukannya adalah dengan menggunakan posixpath.
Cara yang bagus untuk mendukung daftar nilai. Anda dapat menghilangkan efek samping (variabel "dasar" Anda) dengan menggunakan pengurangan. reduce(lambda a, b: urlparse.urljoin(a, b), es) Peta adalah list[n] - to -> list[n]A mengurangi adalahlist[n] - to -> a calculated value
Perhatikan bahwa dengan metode ini, setiap fragmen harus memiliki garis miring ke depan, tanpa garis miring ke depan (untuk menunjukkan bahwa itu adalah fragmen jalur yang digabungkan). Ini lebih tepat / informatif, memberi tahu Anda bahwa itu path1/adalah fragmen jalur URI, dan bukan jalur lengkap /path1/atau tidak diketahuipath1 , yang bisa jadi (dan diperlakukan sebagai jalur lengkap).
Jika Anda perlu menambahkan /fragmen yang kurang, Anda dapat melakukan:
uri = uri if uri.endswith("/")else f"{uri}/"
Untuk mempelajari lebih lanjut tentang resolusi URI, Wikipedia memiliki beberapa contoh bagus.
memperbarui
Hanya pemberitahuan Peter Perron berkomentar tentang pengurangan pada jawaban Shikhar, tapi saya akan meninggalkan ini di sini untuk mendemonstrasikan bagaimana hal itu dilakukan.
Jawaban:
Anda harus menggunakan urlparse.urljoin :
Dengan Python 3 (di mana urlparse diubah namanya menjadi urllib.parse ) Anda dapat menggunakannya sebagai berikut :
sumber
urljoin
dengan 3 atau parameter mode atau pustaka mana yang Anda rekomendasikan untuk ini?/
akan "mereset" dan mengembalikan skema + netloc + lasturl:urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
urljoin('http://www.a.com/', '../../b/c.png')
hasilnya adalah'http://www.a.com/../../b/c.png'
, tetapi tidakhttp://www.a.com/b/c.png
. Jadi, apakah ada metode untuk mendapatkannyahttp://www.a.com/b/c.png
?Jika jalur relatif Anda terdiri dari beberapa bagian, Anda harus menggabungkannya secara terpisah, karena
urljoin
akan menggantikan jalur relatif, bukan menggabungkannya. Cara termudah untuk melakukannya adalah dengan menggunakanposixpath
.Lihat juga: Cara menggabungkan komponen jalur saat Anda membuat URL dengan Python
sumber
sumber
reduce(lambda a, b: urlparse.urljoin(a, b), es)
Peta adalahlist[n] - to -> list[n]
A mengurangi adalahlist[n] - to -> a calculated value
Sederhana.
sumber
Untuk python 3.0+, cara yang benar untuk menggabungkan url adalah:
sumber
Anda dapat menggunakan
reduce
metode Shikhar dengan cara yang lebih bersih.Perhatikan bahwa dengan metode ini, setiap fragmen harus memiliki garis miring ke depan, tanpa garis miring ke depan (untuk menunjukkan bahwa itu adalah fragmen jalur yang digabungkan). Ini lebih tepat / informatif, memberi tahu Anda bahwa itu
path1/
adalah fragmen jalur URI, dan bukan jalur lengkap/path1/
atau tidak diketahuipath1
, yang bisa jadi (dan diperlakukan sebagai jalur lengkap).Jika Anda perlu menambahkan
/
fragmen yang kurang, Anda dapat melakukan:Untuk mempelajari lebih lanjut tentang resolusi URI, Wikipedia memiliki beberapa contoh bagus.
memperbarui
Hanya pemberitahuan Peter Perron berkomentar tentang pengurangan pada jawaban Shikhar, tapi saya akan meninggalkan ini di sini untuk mendemonstrasikan bagaimana hal itu dilakukan.
sumber