Ich habe url
vom Benutzer und ich muss mit dem abgerufenen HTML antworten.
Wie kann ich überprüfen, ob die URL fehlerhaft ist oder nicht?
Zum Beispiel :
url='google' // Malformed
url='google.com' // Malformed
url='http://google.com' // Valid
url='http://google' // Malformed
Wie können wir das erreichen?
python
url
malformedurlexception
Yugal Jindle
quelle
quelle
url='http://google'
ist nicht missgebildet. Schema + Hostname ist immer gültig.Antworten:
Django URL Validierung Regex ( Quelle ):
quelle
ftp
? Oder habe ich eine alte Django-Version?http://[2001:0DB8::3]:8080/index.php?valid=true#result
Eigentlich denke ich, dass dies der beste Weg ist.
Wenn Sie setzen
verify_exists
aufTrue
, wird es tatsächlich überprüfen, ob die URL existiert, sonst wird es nur überprüfen , ob es richtig gebildet wird .edit: ah yeah, diese Frage ist ein Duplikat davon: Wie kann ich überprüfen, ob eine URL mit Djangos Validatoren existiert?
quelle
verify_exists
ist veraltet. -1verify_exists
mehr gibt. Auch anstelle derval
Variablen können Sie es wieURLValidator()('http://www.google.com')
Verwenden Sie das Validators- Paket:
Installieren Sie es von PyPI mit pip (
pip install validators
).quelle
validators.url("http://localhost:8080") ValidationFailure(func=url, args={'public': False, 'value': 'http://localhost:8080'})
Eine True- oder False-Version, basierend auf der @ DMfll-Antwort:
Gibt:
quelle
True
für die Zeichenfolgefake
oder sogar für eine leere Zeichenfolge zurückgegeben. Es wird niemals Fehler geben, da diese Attribute immer vorhanden sind und die Liste immer den booleschen Wert True hat, da sie diese Attribute enthält. Selbst wenn alle Attribute Keine sind, ist die Liste nicht leer. Sie müssen die Attribute überprüfen, da alles so verläuft, wie Sie es jetzt haben.print("I am true") if [False, None, 0, '', [], {}] else print("I am false.")
Gibt "Ich bin wahr" aus. wenn ich es laufen lasse.[result.scheme, result.netloc, result.path]
bewertet immer zuTrue
.print("I am True") if [] else print("I am False.")
druckt "Ich bin falsch." Leere Listen sind also falsch. Der Inhalt des Arrays muss mit so etwas wie derall
Funktion ausgewertet werden.result.path
aus dem Test entfernen .scheme
:if not all([result.scheme in ["file", "http", "https"], result.netloc, result.path]):
Heutzutage verwende ich Folgendes, basierend auf der Antwort des Padam:
Und so sieht es aus:
Einfach benutzen
is_url("http://www.asdf.com")
.Ich hoffe es hilft!
quelle
https://https://https://www.foo.bar
.note - lepl wird leider nicht mehr unterstützt (Sie können es gerne verwenden, und ich denke, der folgende Code funktioniert, aber er wird keine Updates erhalten).
rfc 3696 http://www.faqs.org/rfcs/rfc3696.html definiert, wie dies getan wird (für http-URLs und E-Mails). Ich habe seine Empfehlungen in Python mit Lepl (einer Parser-Bibliothek) implementiert. Siehe http://acooke.org/lepl/rfc3696.html
benutzen:
quelle
Ich bin auf dieser Seite gelandet und habe versucht, einen vernünftigen Weg zu finden, um Zeichenfolgen 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 es bin.
Hier ist eine präzisere Funktion:
quelle
BEARBEITEN
Das ist einfach und funktioniert:
So
min_attr
enthält die Basis - Set von Strings , die Bedürfnisse vorhanden sein , um die Gültigkeit einer URL, also zu definierenhttp://
Teil undgoogle.com
Teil.urlparse.scheme
Geschäftehttp://
undurlparse.netloc
Speichern Sie den Domainnamengoogle.com
all()
Gibt true zurück, wenn alle darin enthaltenen Variablen true zurückgeben. Wenn alsoresult.scheme
undresult.netloc
vorhanden ist, dh einen Wert hat, ist die URL gültig und wird daher zurückgegebenTrue
.quelle
https://www.google
ist eine gültige URL. Möglicherweise wird es nicht wirklich aufgelöst, aber wenn Sie sich darum kümmern, müssen Sie eine DNS-Überprüfung durchführen.Überprüfen Sie die URL mit
urllib
und Django-ähnlichen RegexDer Regex für die Django-URL-Validierung war eigentlich ziemlich gut, aber ich musste ihn für meinen Anwendungsfall ein wenig optimieren. Fühlen Sie sich frei, es an Ihre anzupassen!
Python 3.7
Erläuterung
scheme
und einennetloc
Teil einer bestimmten URL. (Um dies richtig zu machen,urllib.parse.urlparse()
teile ich die URL mit in die beiden entsprechenden Teile, die dann mit den entsprechenden Regex-Begriffen abgeglichen werden.)Der
netloc
Teil stoppt vor dem ersten Auftreten eines Schrägstrichs/
, sodassport
Zahlen immer noch Teil vonnetloc
z.IPv4-Adressen werden ebenfalls überprüft
IPv6-Unterstützung
Wenn der URL-Validator auch mit IPv6-Adressen funktionieren soll, gehen Sie wie folgt vor:
is_valid_ipv6(ip)
aus Markus Jarderots Antwort hinzu , die einen wirklich guten IPv6-Validator-Regex hatand not is_valid_ipv6(domain)
Zum letzten hinzufügenif
Beispiele
Hier sind einige Beispiele für den regulären Ausdruck für den
netloc
(akadomain
) Teil in Aktion:quelle
Alle oben genannten Lösungen erkennen eine Zeichenfolge wie " http://www.google.com/path,www.yahoo.com/path " als gültig an. Diese Lösung funktioniert immer so, wie sie sollte
quelle