2012-09-24 29 views
14

¿Existe una función estándar para comprobar una IRI, para comprobar una dirección URL al parecer, puedo usar:Python: ¿Cómo comprobar si una cadena es un IRI válido?

parts = urlparse.urlsplit(url) 
    if not parts.scheme or not parts.netloc: 
     '''apparently not an url''' 

Probé lo anterior con una URL que contengan caracteres Unicode:

import urlparse 
url = "http://fdasdf.fdsfîășîs.fss/ăîăî" 
parts = urlparse.urlsplit(url) 
if not parts.scheme or not parts.netloc: 
    print "not an url" 
else: 
    print "yes an url" 

y lo que me pasa es yes an url. ¿Esto significa que soy bueno y esto prueba un IRI válido? Hay otra manera ?

+0

Por qué no deberías ser bueno? ¿Su ejemplo viola alguna regla definida por el estándar IRI? En otras palabras: ¿nos está preguntando si su prueba rompe las reglas de IRI? ¿Hiciste esta investigación tú mismo? –

+0

@ Jan-PhilipGehrcke Le estoy pidiendo a alguien que tenga más experiencia que yo con IRI, si soy bueno con esto. –

Respuesta

19

usando urlparse no es suficiente para probar un IRI válido

Uso del rfc3987 package lugar:

from rfc3987 import parse 

parse('http://fdasdf.fdsfîășîs.fss/ăîăî', rule='IRI') 
+3

'ImportError: Ningún módulo llamado rfc3987' por lo que no es estándar,' pip install rfc3987' –

+1

Tienes que instalar el paquete que vincula a –

+0

@DavidRobinson 'pip install rfc3987' funciona también –

1

El único código sensible al conjunto de caracteres en the implementation of urlparse requiere que el esquema contenga solo letras, dígitos y caracteres [+ -] ASCII; de lo contrario, es completamente agnóstico, por lo que funcionará bien con caracteres que no sean ASCII.

Como esto es non-documented behaviour, es su responsabilidad comprobar que siga siendo así (con las pruebas en su proyecto), pero no creo que se modifique para romper los IRI.

urllib ofrece quoting functions para convertir a los IRI/URI de ASCII, aunque todavía no mencionan explícitamente los IRI en la documentación, y que se rompen en algunos casos: Is there a unicode-ready substitute I can use for urllib.quote and urllib.unquote in Python 2.6.5?

+0

'urllib.quote (url)' parece escapar del ':' dos puntos en 'http: //' a 'http% 3A //' –

+1

@EduardFlorinescu sí, de manera predeterminada solo funciona para citar la sección de ruta de un IRI; para obtener un IRI completo necesitaría analizar, citar y volver a ensamblar los componentes. – ecatmur

Cuestiones relacionadas