175

私はurlユーザーから持っており、取得した HTML で返信する必要があります。

URL の形式が正しくないかどうかを確認するにはどうすればよいですか?

例えば ​​:

url = 'google' # Malformed
url = 'google.com' # Malformed
url = 'http://google.com' # Valid
url = 'http://google' # Malformed
4

13 に答える 13

137

実はこれが一番いい方法だと思います。

from django.core.validators import URLValidator
from django.core.exceptions import ValidationError

val = URLValidator(verify_exists=False)
try:
    val('http://www.google.com')
except ValidationError, e:
    print e

に設定verify_existsするTrueと、URL が存在するかどうかが実際に検証されます。

編集: ええ、この質問はこれの複製です: Django のバリデーターで URL が存在するかどうかを確認するにはどうすればよいですか?

于 2011-08-23T12:10:16.593 に答える
122

django url 検証正規表現 ( source ):

import re
regex = re.compile(
        r'^(?:http|ftp)s?://' # http:// or https://
        r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' #domain...
        r'localhost|' #localhost...
        r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
        r'(?::\d+)?' # optional port
        r'(?:/?|[/?]\S+)$', re.IGNORECASE)

print(re.match(regex, "http://www.example.com") is not None) # True
print(re.match(regex, "example.com") is not None)            # False
于 2011-08-23T12:06:48.133 に答える
100

@DMfllの回答に基づくTrueまたはFalseバージョン:

try:
    # python2
    from urlparse import urlparse
except:
    # python3
    from urllib.parse import urlparse

a = 'http://www.cwi.nl:80/%7Eguido/Python.html'
b = '/data/Python.html'
c = 532
d = u'dkakasdkjdjakdjadjfalskdjfalk'
e = 'https://stackoverflow.com'

def uri_validator(x):
    try:
        result = urlparse(x)
        return all([result.scheme, result.netloc])
    except:
        return False

print(uri_validator(a))
print(uri_validator(b))
print(uri_validator(c))
print(uri_validator(d))
print(uri_validator(e))

与えます:

True
False
False
False
True
于 2016-06-24T18:37:20.500 に答える
18

文字列を「有効な」URL として検証する適切な方法を見つけようとして、このページにたどり着きました。ここで、python3 を使用したソリューションを共有します。追加のライブラリは必要ありません。

python2 を使用している場合は、https: //docs.python.org/2/library/urlparse.html を参照してください。

私のように python3 を使用している場合は、https: //docs.python.org/3.0/library/urllib.parse.html を参照してください。

import urllib
from pprint import pprint

invalid_url = 'dkakasdkjdjakdjadjfalskdjfalk'
valid_url = 'https://stackoverflow.com'
tokens = [urllib.parse.urlparse(url) for url in (invalid_url, valid_url)]

for token in tokens:
    pprint(token)

min_attributes = ('scheme', 'netloc')  # add attrs to your liking
for token in tokens:
    if not all([getattr(token, attr) for attr in min_attributes]):
        error = "'{url}' string has no scheme or netloc.".format(url=token.geturl())
        print(error)
    else:
        print("'{url}' is probably a valid url.".format(url=token.geturl()))

ParseResult(scheme='', netloc='', path='dkakasdkjdjakdjadjfalskdjfalk', params='', query='', fragment='')

ParseResult(scheme='https', netloc='stackoverflow.com', path='', params='', query='', fragment='')

「dkakasdkjdjakdjadjfalskdjfalk」文字列には、スキームまたは netloc がありません。

https://stackoverflow.com」はおそらく有効な URL です。

より簡潔な関数を次に示します。

from urllib.parse import urlparse

min_attributes = ('scheme', 'netloc')


def is_valid(url, qualifying=min_attributes):
    tokens = urlparse(url)
    return all([getattr(tokens, qualifying_attr)
                for qualifying_attr in qualifying])
于 2016-03-29T11:52:49.953 に答える
9

- lepl はサポートされなくなりました。申し訳ありません (ご使用を歓迎します。以下のコードは機能すると思いますが、更新される予定はありません)。

rfc 3696 http://www.faqs.org/rfcs/rfc3696.htmlは、これを行う方法を定義しています (http URL と電子メールについて)。lepl (パーサー ライブラリ) を使用して、その推奨事項を Python で実装しました。http://acooke.org/lepl/rfc3696.htmlを参照

使用する:

> easy_install lepl
...
> python
...
>>> from lepl.apps.rfc3696 import HttpUrl
>>> validator = HttpUrl()
>>> validator('google')
False
>>> validator('http://google')
False
>>> validator('http://google.com')
True
于 2011-08-24T22:35:10.263 に答える