Quem sou eu

Minha foto

Formado em Computação, desenvolvedor web, interessado em tecnologia, metaleiro e um gamer inveterado.

Pesquisar

segunda-feira, 27 de agosto de 2012

Extraindo os links de um campo HTML com expressão regular

Desenvolvendo uma ferramenta para mala direta, é importante que os links sejam contabilizados para poder mensurar os resultados.

Mas como fazer isso, sendo que o html será um campo RichText (django-ckeditor) com quantos links o usuário desejar?

O ckeditor gera no banco de dados, um campo do tipo Text e grava o conteúdo inserido em HTML. Para extrairmos os links, basta utilizarmos a mágica da expressão regular.

A estrutura ficou assim:

  • MalaDireta: Uma classe que contém o conteúdo html a ser enviado
  • Links: Uma classe que amarzenará os links gerados pela classe anterior 
Na classe MalaDireta, sobrescreva o método save e deixe-o da seguinte forma:

def save(self):
    self.link_set.all().delete()

    for u in re.findall(r'href=[\'"]?([^\'" >]+)', self.html):
        L = Link(
            maladireta = self,
            link = u,
        )
        L.save()
        self.corpo = self.corpo.replace(u, "%s/verify_url/%s" % (settings.SITE_URL,L.id))
    super(MalaDireta, self).save()

Desta forma, sempre que for alterada, a mala direta irá excluir todos os links vinculádos a ela, e inserir os novos links presentes no corpo.

Depois é só fazer uma view mapeada para a url inserida no replace acima, para contabilizar a visita, e fazer o redirect para o link original.


  • A expressão regular acima, foi testada e consegue recuperar as urls com os seguintes padrões: http://www.sua_url.com http:// 
  • www.sua_url.com.br http:// 
  • www.sua_url.com#sua_ancora http:// 
  • www.sua_url.com?seu_parametro=seu_valor 
  • http:// www.sua_url.com?seu_parametro=seu_valor#sua_ancora 
  • https://www.sua_url.com?seu_parametro=seu_valor#sua_ancora 
  • https://www.sua_url.com?seu_parametro1=seu_valor1&seu_parametro2=seu_valor2#sua_ancora 
  • https://www.sua_url.com/sua_pasta/?seu_parametro1=seu_valor1&seu_parametro2=seu_valor2#sua_ancora 

hasta!