21

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:// であると見なします

4

6 に答える 6

12

netloc を取得するにはプロトコルを指定する必要があるようです。

存在しない場合に追加すると、次のようになります。

import urlparse

url = 'www.amazon.com/Programming-Python-Mark-Lutz'
if '//' not in url:
    url = '%s%s' % ('http://', url)
p = urlparse.urlparse(url)
print p.netloc

この問題の詳細: https://bugs.python.org/issue754016

于 2011-06-14T15:08:08.027 に答える
6

ドキュメントには、貼り付けたテキストのすぐ下に、この正確な例があります。そこにない場合は「//」を追加すると、必要なものが得られます。プロトコルと '//' があるかどうかわからない場合は、正規表現を使用して (または、既に '//' が含まれているかどうかを確認することもできます)、追加する必要があるかどうかを判断できます。

他のオプションは、split('/') を使用して、返されたリストの最初の要素を取得することです。これは、URL にプロトコルまたは '//' がない場合にのみ機能します。

EDIT(将来の読者のために追加):プロトコルを検出するための正規表現は次のようになりますre.match('(?:http|ftp|https)://', url)

于 2011-06-14T14:27:45.643 に答える
6

プロトコルが常に httpの場合、使用できるのは 1 行だけです。

return "http://" + url.split("://")[-1]

より良いオプションは、合格した場合にプロトコルを使用することです:

return url if "://" in url else "http://" + url
于 2014-03-20T11:19:52.657 に答える
5

ドキュメントから:

RFC 1808 の構文仕様に従って、urlparse は「//」によって適切に導入された場合にのみ netloc を認識します。それ以外の場合、入力は相対 URL であると想定されるため、パス コンポーネントで開始されます。

したがって、次のことができます。

In [1]: from urlparse import urlparse

In [2]: def get_netloc(u):
   ...:     if not u.startswith('http'):
   ...:         u = '//' + u
   ...:     return urlparse(u).netloc
   ...: 

In [3]: get_netloc('www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1')
Out[3]: 'www.amazon.com'

In [4]: get_netloc('http://www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1')
Out[4]: 'www.amazon.com'

In [5]: get_netloc('https://www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1')
Out[5]: 'www.amazon.com'
于 2011-06-14T15:13:37.877 に答える
2

URL の先頭に「http://」が存在するかどうかを確認し、存在しない場合は追加することを検討しましたか? もう 1 つの解決策は、最初の部分が実際には netloc であり、相対 URL の一部ではないことを前提として、最初の "/" までのすべてを取得し、それを netloc として使用することです。

于 2011-06-14T14:27:10.713 に答える