私はこれをやっています:
urlparse.urljoin('http://example.com/mypage', '?name=joe')
そして、私はこれを取得します:
'http://example.com/?name=joe'
これを取得したい間:
'http://example.com/mypage?name=joe'
私は何を間違っていますか?
urlparse.urlunparse を使用できます:
import urlparse
parsed = list(urlparse.urlparse('http://example.com/mypage'))
parsed[4] = 'name=joe'
urlparse.urlunparse(parsed)
Python 2.4-2.6 に影響する既知のバグが発生しています。
Python のバージョンを変更またはパッチできない場合は、@jd のソリューションで問題を回避できます。
ただし、標準として機能するより一般的なソリューションが必要なurljoin
場合は、その特定のユース ケースの回避策を実装するラッパー メソッドを使用できます。それ以外の場合は標準にデフォルト設定されurljoin()
ます。
例えば:
import urlparse
def myurljoin(base, url, allow_fragments=True):
if url[0] != "?":
return urlparse.urljoin(base, url, allow_fragments)
if not allow_fragments:
url = url.split("#", 1)[0]
parsed = list(urlparse.urlparse(base))
parsed[4] = url[1:] # assign params field
return urlparse.urlunparse(parsed)
Python 2.6のurlparse
モジュールをプロジェクトにバンドルすることで解決しました。namedtuple
で定義されたものもバンドルする必要がありました。collections
これurlparse
を使用しているためです。
本気ですか?Python 2.7の場合:
>>> import urlparse
>>> urlparse.urljoin('http://example.com/mypage', '?name=joe')
'http://example.com/mypage?name=joe'