Pregunta

Traté de obtener el sitio de origen de una URL. En primer lugar, utilicé un bucle for y logro el objetivo.

home = ''
my_url = 'http://www.mysite.com/subdir/subdir2/index.html'
for item in my_url.split('/')[:3]:
    home += item + '/'
print  home

Y puedo conseguir

'http://www.mysite.com/' 

Luego me encuentro reduciendo () que nunca había usado antes. Así que lo recibo, aquí está el código:

my_url = 'http://www.mysite.com/subdir/subdir2/index.html'
home = ''
home = reduce(lambda x,y : x + y + '/',my_url.split('/')[:3])
print home

Esta vez tengo

'http:/www.mysite.com/'

¿Se reduce solo ommit the Ninguno? ¿Cuál es la explicación del resultado?

Sí, lo sé de este tema que podría usar la función de analizador de Urllib para hacerlo, así que espero que aquí la discusión se centre en la reducción ()

¿Fue útil?

Solución

my_url = 'http://www.mysite.com/subdir/subdir2/index.html'
home = ''
home = reduce(lambda x,y : x + y + '/',my_url.split('/')[:3])

my_url.split('/')[:3] #=> ['http:', '', 'www.mysite.com']

'http:' + '' + '/' #=> 'http:/'
'http:/' + 'www.mysite.com' + '/' #=> 'http:/www.mysite.com/'

Esto no es misterioso. Todo funciona como se esperaba: el problema es que las URL no son uniformes, ya que el protocolo está separado con un corte doble.

Una herramienta útil para comprender cómo los trabajos de reducción es scanl de functional ( http://pypi.python.org/pypi/functional ):

In [11]: home = scanl(lambda x,y : '%s%s/'%(x,y),my_url.split('/')[0],my_url.split('/')[1:3])

In [12]: home
Out[12]: <generator object _scanl at 0x0000000003DEC828>

In [13]: list(home)
Out[13]: ['http:', 'http:/', 'http:/www.mysite.com/']

Tenga en cuenta que str.join implementa un algoritmo ligeramente diferente:

In [16]: '/'.join(my_url.split('/'))
Out[16]: 'http://www.mysite.com/subdir/subdir2/index.html'

Esto es lo que la gente generalmente quiere: es equivalente a:

In [22]: reduce(lambda x,y : '%s/%s'%(x,y),my_url.split('/'))
Out[22]: 'http://www.mysite.com/subdir/subdir2/index.html'

Otros consejos

Sí, sé por este tema que podría usar la función analizadora de Urllib para hacerlo, así que espero que aquí la discusión se centre en el reduce ()

No entiendo por qué quieres reinventar la rueda si hay una función en la biblioteca estándar para hacerlo. Realmente le sugiero que no pierda su tiempo y se familiarice con la biblioteca estándar de Pythons y Use la funcionalidad proporcionada.

De todos modos, de vuelta a tu pregunta: cuando escribo: my_url.split('/')[:3] Entiendo esto:

['http:', '', 'www.mysite.com']

Entonces no hay None En él, solo una cadena vacía, que se puede usar como cualquier otra cadena. Y aparentemente esto es lo que su función Lambda para el reduce El algoritmo sí, solo concatena las cuerdas de nuevo. Te sugiero que uses el strings join Método, ya que es más legible y fácil de entender:

>>> parts = my_url.split('/')[:3]
>>> print "/".join(parts)
'http://www.mysite.com'

Tienes que agregar el último / tú mismo, sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top