Pergunta

Basicamente, eu tenho esse URL atual e essa outra chave que quero fundir em um novo URL, mas existem três casos diferentes.

Suponha que o URL atual seja localhost: 32401/a/b/foo

Se a chave for bar, então eu quero devolver localhost: 32401/a/b/bar

Se a chave começar com uma barra e é/a/bar, então eu quero devolver localhost: 32401/a/bar

Finalmente, se Key é seu próprio URL independente, então eu só quero devolver essa chave = http://foo.com/bar -> http://foo.com/bar

Suponho que exista uma maneira de fazer pelo menos os dois primeiros casos sem manipular as cordas manualmente, mas nada saltou para mim imediatamente no módulo OS.Path.

Foi útil?

Solução

Suponho que exista uma maneira de fazer pelo menos os dois primeiros casos sem manipular as cordas manualmente, mas nada saltou para mim imediatamente no módulo OS.Path.

Isso porque você quer usar urllib.parse (para Python 3.x) ou urlparse (para Python 2.x) em vez disso.

Não tenho muita experiência com isso, então aqui está um trecho usando str.split() e str.join().

urlparts = url.split('/')

if key.startswith('http://'):
    return key
elif key.startswith('/'):
    return '/'.join(urlparts[:2], key[1:])
else:
    urlparts[len(urlparts) - 1] = key
    return '/'.join(urlparts)

Outras dicas

Você verificou o urlparse módulo?

Dos documentos,

from urlparse import urljoin
urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')

Deve ajudar com seu primeiro caso.

Obviamente, você sempre pode fazer manipulação básica de string para o resto.

Os objetos de string no Python têm todos os métodos iniciantes e finais que devem poder chegar lá. Algo assim talvez?

def merge(current, key):
  if key.startswith('http'):
    return key
  if key.startswith('/'):
    parts = current.partition('/')
    return '/'.join(parts[0], key)
  parts = current.rpartition('/')
  return '/'.join(parts[0], key)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top