Lo tengo urldel usuario y tengo que responder con el HTML obtenido.
¿Cómo puedo comprobar si la URL está mal formada o no?
Por ejemplo :
url='google' // Malformed
url='google.com' // Malformed
url='http://google.com' // Valid
url='http://google' // Malformed
¿Cómo podemos lograrlo?
python
url
malformedurlexception
Yugal Jindle
fuente
fuente

url='http://google'no está mal formado. Schema + nombre de host siempre es válido.Respuestas:
regex de validación de URL de django ( fuente ):
fuente
ftp? ¿O tengo una versión antigua de Django?http://[2001:0DB8::3]:8080/index.php?valid=true#resultDe hecho, creo que esta es la mejor forma.
Si se establece
verify_existsqueTrue, en realidad va a comprobar que existe la URL, de lo contrario sólo comprobar si está correctamente formado.editar: ah sí, esta pregunta es un duplicado de esto: ¿Cómo puedo verificar si existe una URL con los validadores de Django?
fuente
verify_existses obsoleto. -1verify_exists. Además, en lugar de lavalvariable, puede llamarlo comoURLValidator()('http://www.google.com')Utilice el paquete de validadores :
Instálelo desde PyPI con pip (
pip install validators).fuente
validators.url("http://localhost:8080") ValidationFailure(func=url, args={'public': False, 'value': 'http://localhost:8080'})Una versión verdadera o falsa, basada en la respuesta de @DMfll:
Da:
fuente
Truepara la cadenafakeo incluso para una cadena en blanco. Nunca habrá errores porque esos atributos siempre están ahí, y la lista siempre tendrá un valor booleano de Verdadero porque contiene esos atributos. Incluso si todos los atributos son Ninguno, la lista seguirá sin estar vacía. Necesita cierta validación de los atributos porque todo pasa como lo tiene ahora.print("I am true") if [False, None, 0, '', [], {}] else print("I am false.")imprime "Soy verdadero". cuando lo ejecuto.[result.scheme, result.netloc, result.path]siempre evalúa aTrue.print("I am True") if [] else print("I am False.")imprime "Soy falso". por lo que las listas vacías son falsas. El contenido de la matriz necesita evaluación con algo como laallfunción.result.pathde la prueba.scheme:if not all([result.scheme in ["file", "http", "https"], result.netloc, result.path]):Hoy en día, uso lo siguiente, basado en la respuesta de Padam:
Y así es como se ve:
Solo usa
is_url("http://www.asdf.com").¡Espero eso ayude!
fuente
https://https://https://www.foo.bar.nota : lepl ya no es compatible, lo siento (puede usarlo y creo que el código siguiente funciona, pero no recibirá actualizaciones).
rfc 3696 http://www.faqs.org/rfcs/rfc3696.html define cómo hacer esto (para http URL y correo electrónico). Implementé sus recomendaciones en Python usando lepl (una biblioteca de analizador). ver http://acooke.org/lepl/rfc3696.html
usar:
fuente
Aterricé en esta página tratando de encontrar una forma sensata de validar cadenas como URL "válidas". Comparto aquí mi solución usando python3. No se requieren bibliotecas adicionales.
Consulte https://docs.python.org/2/library/urlparse.html si está utilizando python2.
Consulte https://docs.python.org/3.0/library/urllib.parse.html si está usando python3 como yo.
Aquí hay una función más concisa:
fuente
EDITAR
Esto es simple y funciona:
Por tanto,
min_attrcontiene el conjunto básico de cadenas que debe estar presente para definir la validez de una URL, es decir,http://parte ygoogle.comparte.urlparse.schemetiendashttp://yurlparse.netlocalmacenar el nombre de dominiogoogle.comall()devuelve verdadero si todas las variables dentro de él devuelven verdadero. Entonces, siresult.schemeyresult.netlocestá presente, es decir, tiene algún valor, entonces la URL es válida y, por lo tanto, regresaTrue.fuente
https://www.googlees una URL válida. Es posible que en realidad no se resuelva, pero si eso le importa, debe hacer una verificación de DNS.Validar URL con
urllibuna expresión regular similar a DjangoLa expresión regular de validación de URL de Django era bastante buena, pero necesitaba modificarla un poco para mi caso de uso. ¡No dudes en adaptarlo al tuyo!
Python 3.7
Explicación
schemey lanetlocparte de una URL determinada. (Para hacer esto correctamente, divido la URLurllib.parse.urlparse()en las dos partes correspondientes que luego se combinan con los términos de expresiones regulares correspondientes).La
netlocparte se detiene antes de la primera aparición de una barra/, por lo que losportnúmeros siguen siendo parte denetloc, por ejemplo:Las direcciones IPv4 también se validan
Soporte IPv6
Si desea que el validador de URL también funcione con direcciones IPv6, haga lo siguiente:
is_valid_ipv6(ip)de la respuesta de Markus Jarderot , que tiene una expresión regular de validación de IPv6 realmente buenaand not is_valid_ipv6(domain)al últimoifEjemplos
Aquí hay algunos ejemplos de la expresión regular para la parte
netloc(también conocida comodomain) en acción:fuente
Todas las soluciones anteriores reconocen una cadena como " http://www.google.com/path,www.yahoo.com/path " como válida. Esta solución siempre funciona como debería
fuente