with una soup scraping scrapear scrap parseo online minutes info how ejemplos datos con como businesses beautiful and python regex parsing

una - scrap with python



AnĂ¡lisis de nombre de host y puerto desde cadena o url (4)

Me pueden dar una cadena en cualquiera de estos formatos:

  • url: por ejemplo, http://www.acme.com:456

  • cadena: por ejemplo, www.acme.com:456, www.acme.com 456, o www.acme.com

Me gustaría extraer el host y si está presente un puerto. Si el valor del puerto no está presente, me gustaría que fuera de 80.

He intentado urlparse , que funciona bien para la url, pero no para el otro formato. Cuando uso urlparse en hostname: port, por ejemplo, coloca el nombre de host en el esquema en lugar de netloc.

Me alegraría tener una solución que use urlparse y una expresión regular, o una expresión regular única que pueda manejar ambos formatos.


La razón por la que falla por:

www.acme.com 456

es porque no es un URI válido. ¿Por qué no simplemente?

  1. Reemplace el espacio con un :
  2. Analice la cadena resultante utilizando el método estándar urlparse

Pruebe y haga uso de la funcionalidad predeterminada tanto como sea posible, especialmente cuando se trata de analizar formatos bien conocidos como los URI.


No estoy familiarizado con urlparse, pero al usar regex harías algo como:

p = ''(?:http.*://)?(?P<host>[^:/ ]+).?(?P<port>[0-9]*).*'' m = re.search(p,''http://www.abc.com:123/test'') m.group(''host'') # ''www.abc.com'' m.group(''port'') # ''123''

O, sin puerto:

m = re.search(p,''http://www.abc.com/test'') m.group(''host'') # ''www.abc.com'' m.group(''port'') # '''' i.e. you''ll have to treat this as ''80''

EDITAR: se ha corregido la expresión regular para que coincida con ''www.abc.com 123''


Puede usar urlparse para obtener el nombre de host de la cadena de URL:

from urlparse import urlparse print urlparse("http://www.website.com/abc/xyz.html").hostname # prints www.website.com


>>> from urlparse import urlparse >>> aaa = urlparse(''http://www.acme.com:456'') >>> aaa.hostname ''www.acme.com'' >>> aaa.port 456 >>>