Tengo un enlace como http://www.techcrunch.com/ y me gustaría obtener solo la parte techcrunch.com del enlace. ¿Cómo hago esto en Python?Obtener Root Domain of Link
Respuesta
Conseguir el nombre de host es bastante fácil de usar urlparse:
hostname = urlparse.urlparse("http://www.techcrunch.com/").hostname
Conseguir el "dominio de la raíz", sin embargo, va a ser más problemático, ya que no está definido en un sentido sintáctico. ¿Cuál es el dominio raíz de "www.theregister.co.uk"? ¿Qué hay de las redes que usan dominios predeterminados? "devbox12" podría ser un nombre de host válido.
Una manera de manejar esto sería el uso de la Public Suffix List, que trata de catalogar los dos dominios de nivel superior reales (por ejemplo, ".com", ".org," ".net"), así como dominios privados que son Usó como TLD (por ejemplo, ".co.uk" o incluso ".github.io"). Puede acceder a la PSL de Python usando la biblioteca publicsuffix2:
import publicsuffix
import urlparse
def get_base_domain(url):
# This causes an HTTP request; if your script is running more than,
# say, once a day, you'd want to cache it yourself. Make sure you
# update frequently, though!
psl = publicsuffix.fetch()
hostname = urlparse.urlparse(url).hostname
return publicsuffix.get_public_suffix(hostname, psl)
Puede explicar cómo este código nombre de host = ".". join (len (nombre de host [-2]) <4 y nombre de host [-3:] o nombre de host [-2:] ¿funciona? Gracias – Joozty
@Joozty - Los índices negativos comienzan desde el final, por lo que 'nombre de host [-2]' significa la penúltima entrada (en este caso, el nombre de host dividido por puntos). 'foo y bar o baz' funciona como un ternario: si" foo "es verdadero, devuelve" barra "; de lo contrario, devuelve "baz". Finalmente, 'hostname [-3:]' significa las últimas tres partes. En conjunto, esto significa que "si la penúltima parte del nombre de host tiene menos de cuatro caracteres, use las últimas tres partes y únelas con puntos. De lo contrario, tome solo las dos últimas partes y únelas". –
Por alguna razón, incluso después de instalar el módulo, en Python 3 obtengo 'ImportError: no puedo importar el nombre 'get_public_suffix''. No pude encontrar ninguna respuesta en línea o en la documentación, así que simplemente usé "tldextract" en su lugar, ¡lo que simplemente funciona! Por supuesto, tuve que 'sudo pip3 install tldextract' primero. – Nagev
Esto funcionó para mis propósitos. Pensé que lo compartiría.
".".join("www.sun.google.com".split(".")[-2:])
¿Qué tal probar "www.sun.google.co.uk"? Obtendrá "co.uk" en lugar de "google.co.uk" ... ¡Saludos! –
Ya, usa el enfoque de Ben Blank. No estoy seguro de lo que estaba pensando (en 2010) :-) –
______Using Python 3.3 y 2.x no ________
Me gustaría añadir una cosa pequeña a la respuesta de Ben en blanco.
from urllib.parse import quote,unquote,urlparse
u=unquote(u) #u= URL e.g. http://twitter.co.uk/hello/there
g=urlparse(u)
u=g.netloc
Por ahora, sólo tiene el nombre de dominio de urlparse.
Para eliminar los subdominios, primero debes saber cuáles son dominios de nivel superior y cuáles no. P.ej. en el anterior http://twitter.co.uk
- co.uk
es un TLD mientras que en http://sub.twitter.com
tenemos solo .com
como TLD y sub
es un subdominio.
Por lo tanto, necesitamos obtener un archivo/lista que tenga todos los tlds.
tlds = load_file("tlds.txt") #tlds holds the list of tlds
hostname = u.split(".")
if len(hostname)>2:
if hostname[-2].upper() in tlds:
hostname=".".join(hostname[-3:])
else:
hostname=".".join(hostname[-2:])
else:
hostname=".".join(hostname[-2:])
Estructura general de URL:
scheme://netloc/path;parameters?query#fragment
Como TIMTOWTDI lema:
Usando urlparse,
>>> from urllib.parse import urlparse # python 3.x
>>> parsed_uri = urlparse('http://www.stackoverflow.com/questions/41899120/whatever') # returns six components
>>> domain = '{uri.netloc}/'.format(uri=parsed_uri)
>>> result = domain.replace('www.', '') # as per your case
>>> print(result)
'stackoverflow.com/'
Usando tldextract,
>>> import tldextract # The module looks up TLDs in the Public Suffix List, mantained by Mozilla volunteers
>>> tldextract.extract('http://forums.news.cnn.com/')
ExtractResult(subdomain='forums.news', domain='cnn', suffix='com')
en su caso:
>>> extracted = tldextract.extract('http://www.techcrunch.com/')
>>> '{}.{}'.format(extracted.domain, extracted.suffix)
'techcrunch.com'
tldextract
on the other hand knows what all gTLDs [Generic Top-Level Domains] and ccTLDs [Country Code Top-Level Domains] look like by looking up the currently living ones according to the Public Suffix List. So, given a URL, it knows its subdomain from its domain, and its domain from its country code.
Cheerio!:)
El siguiente script no es perfecto, pero se puede utilizar para visualizar/acortar. Si realmente quiere/necesita evitar dependencias de terceros, especialmente buscar de forma remota y almacenar en caché algunos datos de TLD, le sugiero que siga el script que uso en mis proyectos. Utiliza las dos últimas partes del dominio para las extensiones de dominio más comunes y deja las últimas tres partes para el resto de las extensiones de dominio menos conocidas. En peor de los casos dominio escenario tendrá tres partes: en lugar de dos
from urlparse import urlparse
def extract_domain(url):
parsed_domain = urlparse(url)
domain = parsed_domain.netloc or parsed_domain.path # Just in case, for urls without scheme
domain_parts = domain.split('.')
if len(domain_parts) > 2:
return '.'.join(domain_parts[-(2 if domain_parts[-1] in {
'com', 'net', 'org', 'io', 'ly', 'me', 'sh', 'fm', 'us'} else 3):])
return domain
extract_domain('google.com') # google.com
extract_domain('www.google.com') # google.com
extract_domain('sub.sub2.google.com') # google.com
extract_domain('google.co.uk') # google.co.uk
extract_domain('sub.google.co.uk') # google.co.uk
extract_domain('www.google.com') # google.com
extract_domain('sub.sub2.voila.fr') # sub2.voila.fr
def get_domain(url):
u = urlsplit(url)
return u.netloc
def get_top_domain(url):
u"""
>>> get_top_domain('http://www.google.com')
'google.com'
>>> get_top_domain('http://www.sina.com.cn')
'sina.com.cn'
>>> get_top_domain('http://bbc.co.uk')
'bbc.co.uk'
>>> get_top_domain('http://mail.cs.buaa.edu.cn')
'buaa.edu.cn'
"""
domain = get_domain(url)
domain_parts = domain.split('.')
if len(domain_parts) < 2:
return domain
top_domain_parts = 2
# if a domain's last part is 2 letter long, it must be country name
if len(domain_parts[-1]) == 2:
if domain_parts[-1] in ['uk', 'jp']:
if domain_parts[-2] in ['co', 'ac', 'me', 'gov', 'org', 'net']:
top_domain_parts = 3
else:
if domain_parts[-2] in ['com', 'org', 'net', 'edu', 'gov']:
top_domain_parts = 3
return '.'.join(domain_parts[-top_domain_parts:])
- 1. DDD/DI (Unity)/.NET/Composition Root - Domain Services
- 2. Cómo obtener el Root raíz
- 3. obtener Hard Link Count en Java
- 4. Obtener firstdate, lastdate of month?
- 5. ¿Cómo obtener privilegios de root mediante programación?
- 6. ¿Cómo puedo obtener DOMAIN \ USER desde AD DirectoryEntry?
- 7. PHP Domain Model
- 8. Ajax Cross Domain Calls
- 9. php setcookie domain
- 10. Firefox Cross Domain Request
- 11. cross-domain iframe resizer?
- 12. Cross Domain User Tracking
- 13. Float Domain Error
- 14. jQuery cross domain iframe scripting
- 15. Javadoc @see o {@link}?
- 16. Bizspark Renew Link
- 17. MinGW Link Single EXE
- 18. Weak link framework
- 19. @import vs link
- 20. HTML: iCal Link?
- 21. ¿Cómo obtener el valor del atributo xml de root?
- 22. linux: ¿Cómo obtener ssid inalámbrico sin permiso de root?
- 23. ¿Puedo obtener el permiso de root sin dejar vim?
- 24. iPad Contact Link CSS Override
- 25. DDD Domain Model Complex Validation
- 26. Azure ACS 2 Custom Domain
- 27. cross-domain AJAX post call
- 28. backbone.js y cross domain scripting
- 29. Formulario HTML POST Cross Domain
- 30. Cadena de análisis para Domain/hostName
Esto podría hacer el truco. http://docs.python.org/library/urlparse.html – Eli