URL を解析する必要があります。現在、urlparse.urlparse() と urlparse.urlsplit() を使用しています。
問題は、スキームが存在しない場合、URL から「netloc」(ホスト) を取得できないことです。つまり、次の URL があるとします。
www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1
ネットロックを取得できません: www.amazon.com
Pythonのドキュメントによると:
RFC 1808 の構文仕様に従って、urlparse は「//」によって適切に導入された場合にのみ netloc を認識します。それ以外の場合、入力は相対 URL であると想定されるため、パス コンポーネントで開始されます。
というわけで、わざとこうなっています。しかし、その URL から netloc を取得する方法がまだわかりません。
スキームが存在するかどうかを確認し、存在しない場合は追加して解析できると思います。しかし、この解決策はあまり良くないようです。
もっと良いアイデアはありますか?
編集: すべての回答をありがとう。しかし、コーリーらが提案している「startswith」ということはできません。他のプロトコル/スキームの URL を取得すると、めちゃくちゃになってしまうからです。見る:
この URL を取得した場合:
ftp://something.com
提案されたコードでは、「http://」を最初に追加して、めちゃくちゃにします。
私が見つけた解決策
if not urlparse.urlparse(url).scheme:
url = "http://"+url
return urlparse.urlparse(url)
注意事項:
最初にいくつかの検証を行い、スキームが指定されていない場合は http:// であると見なします