web-dev-qa-db-ja.com

PythonでのURLの検証

私は(特にPythonで)URLを検証する最良の方法が何であるかを理解しようとしましたが、実際には答えを見つけることができませんでした。 URLを検証する方法は1つも知られていないようで、検証する必要があると思われるURLによって異なります。また、URL構造の読みやすい標準を見つけるのが難しいことに気付きました。 RFC 3986と3987は見つかりましたが、RFCの構造だけでなく、それ以上のものが含まれています。

何か不足していますか、それともURLを検証する標準的な方法はありませんか?

15
mp94

これは重複しているようです Pythonで正規表現を使用してURLを検証するにはどうすればよいですか

そこで説明されているurlparseライブラリを使用できるはずです。

>>> from urllib.parse import urlparse # python2: from urlparse import urlparse
>>> urlparse('actually not a url')
ParseResult(scheme='', netloc='', path='actually not a url', params='', query='', fragment='')
>>> urlparse('http://google.com')
ParseResult(scheme='http', netloc='google.com', path='', params='', query='', fragment='')

チェックする文字列に対してurlparseを呼び出し、次にParseResultschemeおよびnetlocの属性があることを確認します

22
bgschiller

元の質問は少し古いですが、数か月前にリリースした Validator-Collection ライブラリも確認することをお勧めします。これには、RFC標準に準拠するためのURLの高性能な正規表現ベースの検証が含まれます。いくつかの詳細:

  • Python 2.7、3.4、3.5、3.6に対してテスト済み
  • Python 3.xの依存関係なし、Python 2.xの条件付き依存関係の1つ(Python 2.xのバグがあるreモジュール)
  • 非標準の文字などを含む、約80種類の成功/失敗するURLパターンをカバーする単体テスト。私が見つけたのと同じくらいRFC標準の全範囲をカバーするのに近い。

使い方もとても簡単です。

from validator_collection import validators, checkers

checkers.is_url('http://www.stackoverflow.com')
# Returns True

checkers.is_url('not a valid url')
# Returns False

value = validators.url('http://www.stackoverflow.com')
# value set to 'http://www.stackoverflow.com'

value = validators.url('not a valid url')
# raises a validator_collection.errors.InvalidURLError (which is a ValueError)

さらに、 Validator-Collection には、ドメインやメールアドレスなど、他に約60以上のバリデーターが含まれているため、他の人にも役立つかもしれません。

10

urllib.requestは、urlopen関数でURLを渡し、URLErrorの例外をキャッチして検証します。

from urllib.request import urlopen, URLError

def validate_web_url(url="http://google"):
    try:
        urlopen(url)
        return True
    except URLError:
        return False

これはreturn False この場合

1
Hamza

バリデーターパッケージを使用します。これは、ドキュメントとインストール手順への link です。

それはと同じくらい簡単です

import validators
url = 'YOUR URL'
validators.url(url)

ある場合はtrueを返し、そうでない場合はfalseを返します。

1
Tony Hammack