J'ai url
de l'utilisateur et je dois répondre avec le HTML récupéré.
Comment puis-je vérifier si l'URL est malformée ou non?
Par exemple :
url='google' // Malformed
url='google.com' // Malformed
url='http://google.com' // Valid
url='http://google' // Malformed
Comment pouvons-nous y parvenir ?
python
url
malformedurlexception
Yugal Jindle
la source
la source
url='http://google'
n'est pas mal formé. Schéma + nom d'hôte est toujours valide.Réponses:
django url validation regex ( source ):
la source
ftp
? Ou ai-je une ancienne version de django?http://[2001:0DB8::3]:8080/index.php?valid=true#result
En fait, je pense que c'est la meilleure façon.
Si vous définissez
verify_exists
surTrue
, il vérifiera réellement que l'URL existe, sinon il vérifiera simplement si elle est correctement formée.edit: ah ouais, cette question est un double de ceci: Comment puis-je vérifier si une URL existe avec les validateurs de Django?
la source
verify_exists
est obsolète. -1verify_exists
plus. Aussi au lieu de laval
variable, vous pouvez l'appeler commeURLValidator()('http://www.google.com')
Utilisez le package des validateurs :
Installez-le depuis PyPI avec pip (
pip install validators
).la source
validators.url("http://localhost:8080") ValidationFailure(func=url, args={'public': False, 'value': 'http://localhost:8080'})
Une version True ou False, basée sur la réponse @DMfll:
Donne:
la source
True
pour la chaînefake
ou même pour une chaîne vide. Il n'y aura jamais d'erreur car ces attributs sont toujours là et la liste aura toujours une valeur booléenne True car elle contient ces attributs. Même si tous les attributs sont Aucun, la liste sera toujours non vide. Vous avez besoin d'une certaine validation des attributs car tout se passe comme vous l'avez maintenant.print("I am true") if [False, None, 0, '', [], {}] else print("I am false.")
affiche «Je suis vrai». quand je l'exécute.[result.scheme, result.netloc, result.path]
évalue toujours àTrue
.print("I am True") if [] else print("I am False.")
imprime "Je suis faux." les listes vides sont donc fausses. Le contenu du tableau doit être évalué avec quelque chose comme laall
fonction.result.path
du test.scheme
:if not all([result.scheme in ["file", "http", "https"], result.netloc, result.path]):
De nos jours, j'utilise ce qui suit, basé sur la réponse du Padam:
Et voici à quoi ça ressemble:
Utilisez simplement
is_url("http://www.asdf.com")
.J'espère que ça aide!
la source
https://https://https://www.foo.bar
.note - lepl n'est plus pris en charge, désolé (vous pouvez l'utiliser, et je pense que le code ci-dessous fonctionne, mais il ne recevra pas de mises à jour).
rfc 3696 http://www.faqs.org/rfcs/rfc3696.html définit comment procéder (pour les URL http et les e-mails). J'ai implémenté ses recommandations en python en utilisant lepl (une bibliothèque d'analyseurs). voir http://acooke.org/lepl/rfc3696.html
utiliser:
la source
J'ai atterri sur cette page en essayant de trouver un moyen sensé de valider les chaînes comme URL "valides". Je partage ici ma solution utilisant python3. Aucune bibliothèque supplémentaire requise.
Voir https://docs.python.org/2/library/urlparse.html si vous utilisez python2.
Voir https://docs.python.org/3.0/library/urllib.parse.html si vous utilisez python3 comme je le suis.
Voici une fonction plus concise:
la source
ÉDITER
Ceci est simple et fonctionne:
min_attr
Contient donc l'ensemble de base de chaînes qui doit être présent pour définir la validité d'une URL, c'est-à-dire unehttp://
partie et unegoogle.com
partie.urlparse.scheme
magasinshttp://
eturlparse.netloc
stocker le nom de domainegoogle.com
all()
renvoie true si toutes les variables qu'il contient renvoient true. Donc, siresult.scheme
etresult.netloc
est présent, c'est-à-dire a une valeur, alors l'URL est valide et donc retourneTrue
.la source
https://www.google
est une URL valide. Cela ne résoudra peut-être pas vraiment, mais si cela vous intéresse, vous devez effectuer une vérification DNS.Valider l'URL avec une
urllib
expression régulière de type DjangoLe regex de validation d'URL de Django était en fait assez bon, mais j'avais besoin de le peaufiner un peu pour mon cas d'utilisation. N'hésitez pas à l'adapter au vôtre!
Python 3.7
Explication
scheme
etnetloc
d'une URL donnée. (Pour ce faire correctement, j'ai divisé l'URL avecurllib.parse.urlparse()
les deux parties correspondantes qui sont ensuite mises en correspondance avec les termes regex correspondants.)La
netloc
partie s'arrête avant la première occurrence d'une barre oblique/
, donc lesport
nombres font toujours partie denetloc
, par exemple:Les adresses IPv4 sont également validées
Prise en charge d'IPv6
Si vous souhaitez que le validateur d'URL fonctionne également avec les adresses IPv6, procédez comme suit:
is_valid_ipv6(ip)
partir de la réponse de Markus Jarderot , qui a un très bon validateur IPv6 regexand not is_valid_ipv6(domain)
au dernierif
Exemples
Voici quelques exemples de regex pour la partie
netloc
(akadomain
) en action:la source
Toutes les solutions ci-dessus reconnaissent une chaîne comme " http://www.google.com/path,www.yahoo.com/path " comme valide. Cette solution fonctionne toujours comme il se doit
la source