2014-06-13 9 views
6

Python 2'deki bir URL'nin bazı bölümlerini değiştirmenin daha temiz bir yolu var mı? Şu andaPython 2'deki URL bileşenlerini değiştirme

http://foo/bar -> http://foo/yah 

Örneğin

, bunu yapıyorum:

import urlparse 

url = 'http://foo/bar' 

# Modify path component of URL from 'bar' to 'yah' 
# Use nasty convert-to-list hack due to urlparse.ParseResult being immutable 
parts = list(urlparse.urlparse(url)) 
parts[2] = 'yah' 

url = urlparse.urlunparse(parts) 

mı var daha temiz bir çözüm?

+0

Tam olarak 'temiz' ile ne demek istiyorsunuz? –

cevap

16

Maalesef, belgeler güncel değil; urlparse.urlparse() (ve urlparse.urlsplit()) tarafından üretilen sonuçlar baz olarak collections.namedtuple()-produced class kullanır.

bir liste halinde bu namedtuple çevirmek, ama sadece bu görev için sağlanan yarar yönteminin kullanımını yapmayın:

parts = urlparse.urlparse(url) 
parts = parts._replace(path='yah') 

url = parts.geturl() 

namedtuple._replace() method değiştirdiğiniz belirli unsurları ile yeni bir kopyasını oluşturmanızı sağlar. ParseResult.geturl() method daha sonra parçaları sizin için bir URL'ye yeniden ekler.

Demo:

>>> import urlparse 
>>> url = 'http://foo/bar' 
>>> parts = urlparse.urlparse(url) 
>>> parts = parts._replace(path='yah') 
>>> parts.geturl() 
'http://foo/yah' 

mgilson dokümantasyon sorunu gidermek için bir bug report (with patch) açtı.

+0

Bunu işaret edecektim. Yardımcı yöntemler, 'namedtuple' tarafından döndürülen alt sınıf tarafından 'urlparse.ParseResult' için sağlanmıştır. Bu 2.7 docs dikkat edilmelidir, çünkü, bilmeden, bu sınıf için kamu API '_replace' aslında _is_ parçası olduğunu bilmenin bir yolu yok çünkü ... – mgilson

+0

Daha da ilginç olan Kaynakta hiç görünmeyen dokümanlarda '' BaseResult'] (https://docs.python.org/2/library/urlparse.html#urlparse.BaseResult) ... (Diggresyon için üzgünüm) Geç oldu… +1 yine de) – mgilson

+0

@mgilson: heh, gerçekten de, bu isimden önce bir isim olmalı. –

-1

Bunu yapmanın doğru yolu bu şekilde.

_replace'un kullanıldığı özel yöntemler veya değişkenler önerilmemektedir.

from urlparse import urlparse, urlunparse 

res = urlparse('http://www.goog.com:80/this/is/path/;param=paramval?q=val&foo=bar#hash') 
l_res = list(res) 
# this willhave ['http', 'www.goog.com:80', '/this/is/path/', 'param=paramval', 'q=val&foo=bar', 'hash'] 
l_res[2] = '/new/path' 
urlunparse(l_res) 
# outputs 'http://www.goog.com:80/new/path;param=paramval?q=val&foo=bar#hash' 
+1

genel arayüzün bir parçası, sadece gerçek üyelerle çatışmamak için altçizgi ile önekli. – vidstige