python - unquote - urllib parse download
Python urlparse-extraer nombre de dominio sin subdominio (7)
Esta no es una descomposición estándar de las URL.
No puedes confiar en www.
estar presente u opcional. En muchos casos no lo hará.
Entonces, si desea suponer que solo los dos últimos componentes son relevantes (que tampoco funcionarán para el Reino Unido, por ejemplo, www.google.co.uk
), entonces puede hacer una split(''.'')[-2:]
O, que en realidad es menos propenso a errores, tira un www.
prefijo.
Pero de cualquier manera no se puede asumir que el www.
es opcional, porque NO funcionará todo el tiempo!
Aquí hay una lista de sufijos comunes para dominios. Puede intentar guardar el sufijo + un componente.
https://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1
Pero, ¿cómo planeas manejar, por ejemplo, los dominios first.last.name
? ¿Asume que todos los usuarios con el mismo apellido son la misma compañía? Inicialmente, solo podría obtener dominios de tercer nivel allí. Por ahora, aparentemente también puedes obtener un segundo nivel. Entonces para .name
no hay una regla general.
Necesita una forma de extraer un nombre de dominio sin el subdominio de una url usando Python urlparse.
Por ejemplo, me gustaría extraer "google.com"
de una URL completa como "http://www.google.com"
.
Lo más parecido que puedo parecer con urlparse
es el atributo netloc
, pero eso incluye el subdominio, que en este ejemplo sería www.google.com
.
Sé que es posible escribir algo de manipulación de cadenas personalizadas para convertir www.google.com en google.com, pero quiero evitar las transformaciones de cadenas manuales o expresiones regulares en esta tarea. (La razón de esto es que no estoy lo suficientemente familiarizado con las reglas de formación de url para estar seguro de que podría considerar cada caso extremo requerido al escribir una función de análisis personalizada).
O, si urlparse
no puede hacer lo que necesito, ¿alguien sabe que otras bibliotecas de análisis de urlparse
Python lo harían?
Esta es una actualización, basada en la solicitud de recompensa de una respuesta actualizada
Comience usando el paquete tld . Una descripción del paquete:
Extrae el dominio de nivel superior (TLD) de la URL indicada. La lista de nombres de TLD está tomada de Mozilla http://mxr.mozilla.org/mozilla/source/netwerk/dns/src/effective_tld_names.dat?raw=1
from tld import get_tld
from tld.utils import update_tld_names
update_tld_names()
print get_tld("http://www.google.co.uk")
print get_tld("http://zap.co.it")
print get_tld("http://google.com")
print get_tld("http://mail.google.com")
print get_tld("http://mail.google.co.uk")
print get_tld("http://google.co.uk")
Estas salidas
google.co.uk
zap.co.it
google.com
google.com
google.co.uk
google.co.uk
Tenga en cuenta que maneja correctamente los TLD a nivel de país dejando co.it
y co.it
, pero elimina correctamente los subdominios www
y mail
para .com
y .co.uk
La llamada update_tld_names()
al comienzo del script se usa para actualizar / sincronizar los nombres del tld con la versión más reciente de Mozilla.
Hay varios módulos de Python que encapsulan la Lista de sufijos públicos (una vez Mozilla) en una biblioteca, muchos de los cuales no requieren que la entrada sea una URL. A pesar de que la pregunta se refiere específicamente a la normalización de URL, mi requisito era manejar solo nombres de dominio, por lo que ofrezco una respuesta tangencial para eso.
Los méritos relativos de publicsuffix2 sobre publicsuffixlist o publicsuffix no están claros, pero todos parecen ofrecer la funcionalidad básica.
publicsuffix2:
>>> import publicsuffix # sic
>>> publicsuffix.PublicSuffixList().get_public_suffix(''www.google.co.uk'')
u''google.co.uk''
- Supuestamente, más tenedor amigable con el envase de
publicsuffix
.
publicsuffixlist:
>>> import publicsuffixlist
>>> publicsuffixlist.PublicSuffixList().privatesuffix(''www.google.co.uk'')
''google.co.uk''
-
idna
soporte deidna
, que sin embargo no he probado.
publicsuffix:
>>> import publicsuffix
>>> publicsuffix.PublicSuffixList(publicsuffix.fetch()).get_public_suffix(''www.google.co.uk'')
''google.co.uk''
- El requisito de manejar las actualizaciones y almacenar en caché el archivo descargado usted mismo es un poco complicado.
Para la manipulación del nombre de dominio, también puede usar Dnspy
Ayuda a extraer dominios (y etiquetas de dominio) en varios niveles, usando una copia nueva de la lista de Sufijo público de Mozilla.
Probablemente desee consultar tldextract , una biblioteca diseñada para hacer este tipo de cosas.
Utiliza la lista de sufijos públicos para tratar de obtener una división decente basada en gTLD conocidos, pero tenga en cuenta que esta es solo una lista de fuerza bruta, nada especial, por lo que puede quedar desactualizada (aunque es de esperar que esté seleccionada para no )
>>> import tldextract
>>> tldextract.extract(''http://forums.news.cnn.com/'')
ExtractResult(subdomain=''forums.news'', domain=''cnn'', suffix=''com'')
Entonces en tu caso:
>>> extracted = tldextract.extract(''http://www.google.com'')
>>> "{}.{}".format(extracted.domain, extracted.suffix)
"google.com"
Usar el tldexport funciona bien, pero aparentemente tiene un problema al analizar el subdominio blogspot.com y crear un desastre. Si desea continuar con esa biblioteca, asegúrese de implementar una condición if o algo para evitar devolver una cadena vacía en el subdominio.
from tld import get_tld
from tld.utils import update_tld_names
update_tld_names()
result=get_tld(''http://www.google.com'')
print ''https://''+result
Entrada: http://www.google.com
Resultado: google.com