Python – Wie validiere ich eine URL in Python? (Missgebildet oder nicht)

Ich habe url vom Benutzer und ich muss mit dem geholten HTML antworten.

Wie kann ich überprüfen, ob die URL errorshaft ist oder nicht?

Beispielsweise :

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

Wie können wir das erreichen?

django url validation Regex:

 regex = re.compile( r'^(?:http|ftp)s?://' # http:// or https:// r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[AZ]{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 

Eigentlich denke ich, das ist der beste Weg.

 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 

Wenn Sie verify_exists auf True , wird tatsächlich überprüft, ob die URL existiert. Andernfalls wird nur überprüft, ob die URL korrekt erstellt wurde.

edit: ah yeah, diese Frage ist ein Duplikat davon: Wie kann ich überprüfen, ob eine URL mit Djangos Validatoren existiert?

Verwenden Sie das validationspaket :

 >>> import validators >>> validators.url("http://google.com") True >>> validators.url("http://google") ValidationFailure(func=url, args={'value': 'http://google', 'require_tld': True}) >>> if not validators.url("http://google"): ... print "not valid" ... not valid >>> 

Installieren Sie es mit Pip ( pip install validators ).

Eine True oder False-Version basierend auf @DMfll-Antwort:

 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' def uri_validator(x): try: result = urlparse(x) return result.scheme and result.netloc and result.path except: return False print(uri_validator(a)) print(uri_validator(b)) print(uri_validator(c)) print(uri_validator(d)) 

Gibt:

 True True False True 

Hinweis – lepl wird nicht mehr unterstützt, sorry (Sie können es gerne verwenden, und ich denke, der Code unten funktioniert, aber es wird keine Updates erhalten).

rfc 3696 http://www.faqs.org/rfcs/rfc3696.html definiert, wie dies zu tun ist (für http URLs und E-Mail). Ich implementierte seine Empfehlungen in Python mit lepl (eine Parser-Bibliothek). siehe http://acooke.org/lepl/rfc3696.html

benutzen:

 > easy_install lepl ... > python ... >>> from lepl.apps.rfc3696 import HttpUrl >>> validator = HttpUrl() >>> validator('google') False >>> validator('http://google') False >>> validator('http://google.com') True 

Ich bin auf dieser Seite gelandet und habe versucht, einen vernünftigen Weg zu finden, Strings als “gültige” URLs zu validieren. Ich teile hier meine Lösung mit Python3. Keine zusätzlichen Bibliotheken erforderlich.

Siehe https://docs.python.org/2/library/urlparse.html, wenn Sie python2 verwenden.

Siehe https://docs.python.org/3.0/library/urllib.parse.html, wenn Sie python3 so verwenden wie ich bin.

 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 (Schema = ”, netloc = ”, Pfad = ‘dkakasdkjdjakdjadjfalskdjfalk’, params = ”, query = ”, Fragment = ”)

ParseResult (Schema = ‘https’, netloc = ‘stackoverflow.com’, Pfad = ”, Parameter = ”, Abfrage = ”, Fragment = ”)

‘dkakasdkjdjakdjadjfalskdjfalk’ String hat kein Schema oder Netloc.

https://stackoverflow.com ” ist wahrscheinlich eine gültige URL.

Hier ist eine prägnante function:

 import urllib min_attributes = ('scheme', 'netloc') def is_valid(url, qualifying=None): qualifying = min_attributes if qualifying is None else qualifying token = urllib.parse.urlparse(url) return all([getattr(token, qualifying_attr) for qualifying_attr in qualifying]) 

BEARBEITEN Wie von @Kwame gezeigt, validiert der Code die URL, auch wenn die .com, .co nicht vorhanden sind.

Das ist einfach und funktioniert:

So hat min_attr die grundlegende Zeichenfolge, die vorhanden sein muss, um die URL zu definieren, dh http:// part und google.com part.

urlparse.scheme speichert http:// und

urlparse.netloc speichert den Domainnamen google.com

all() gibt true zurück, wenn alle darin enthaltenen Variablen wahr sind. Wenn also result.scheme und result.netloc vorhanden sind, ist die URL gültig und gibt daher True .

 from urlparse import urlparse def url_check(url): min_attr = ('scheme' , 'netloc') try: result = urlparse(url) if all([result.scheme, result.netloc]): return True else: return False except: return False