私はurl
ユーザーから持っており、取得した HTML で返信する必要があります。
URL の形式が正しくないかどうかを確認するにはどうすればよいですか?
例えば :
url = 'google' # Malformed
url = 'google.com' # Malformed
url = 'http://google.com' # Valid
url = 'http://google' # Malformed
私はurl
ユーザーから持っており、取得した HTML で返信する必要があります。
URL の形式が正しくないかどうかを確認するにはどうすればよいですか?
例えば :
url = 'google' # Malformed
url = 'google.com' # Malformed
url = 'http://google.com' # Valid
url = 'http://google' # Malformed
実はこれが一番いい方法だと思います。
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 が存在するかどうかを確認するにはどうすればよいですか?
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
@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
文字列を「有効な」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])
注- 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