Domanda Python: come verificare se una stringa è un IRI valido?


Esiste una funzione standard per controllare un IRI, per controllare un URL apparentemente posso usare:

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

Ho provato quanto sopra con un URL contenente caratteri 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"

e quello che ottengo è yes an url. Questo significa che sto bene un test per un IRI valido? C'è un altro modo?


14
2017-09-24 12:31


origine


risposte:


utilizzando urlparse non è sufficiente per testare un IRI valido.

Usa il rfc3987 pacchetto anziché:

from rfc3987 import parse

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

19
2017-09-24 12:46



L'unico codice sensibile al set di caratteri in l'implementazione di urlparse richiede che lo schema contenga solo lettere ASCII, cifre e caratteri [+ -.]; altrimenti è completamente agnostico, quindi funzionerà bene con caratteri non ASCII.

Come questo è comportamento non documentato, è tua responsabilità controllare che continui ad essere il caso (con test nel tuo progetto), ma non immagino che sarebbe cambiato per rompere gli IRI.

fornisce urllib citando le funzioni per convertire gli IRI in / da URI ASCII, anche se non menzionano esplicitamente gli IRI nella documentazione, e in alcuni casi sono interrotti: C'è un sostituto pronto per Unicode che posso usare per urllib.quote e urllib.unquote in Python 2.6.5?


1
2017-09-24 12:41