quinta-feira, 20 de dezembro de 2012

Como utilizar RSS de um site externo como fonte de conteúdo

Deseja colocar eu seu site o conteúdo de um RSS de um site externo?
Tarefa simples para o FeedParser (http://pypi.python.org/pypi/feedparser/)

Para tal, instale o FeedParser no seu ENV:
pip install feedparser

Na sua view que será responsável por buscar o conteúdo no site externo faça como abaixo:

def sua_view(request):
    import feedparser
    d = feedparser.parse('http://www.seu_site_externo.com.br/rss/')
    noticias = d['entries']
    VARS = {
        'noticias':noticias,
    }
    return render_to_response('noticias.html', VARS, context_instance=RequestContext(request))

E para acessar os conteúdos no template, utilize os dados conforme desejado, segue a lista dos atributos que o RSS retorna:
  • comments 
  • description
  • guidislink 
  • id
  • link 
  • links 
  • published 
  • published_parsed 
  • summary 
  • summary_detail 
  • tags 
  • title 
  • title_detail

hasta!

quarta-feira, 21 de novembro de 2012

Recuperando conteúdo de uma Tag HTML de uma URL

Recentemente precisei recuperar o conteúdo de uma tag html de uma URL para um propósito específico.

O Youtube, fez o favor de remover as famosas Tags dos vídeos de suas páginas, juntamente com o atributo de mesmo nome de sua API de integração. Com isso, não consegui mais peguar as tags para atualizar os vídeos de um projeto.

Percebi porém , que se procurasse no código fonte de cada página de vídeo, lá estavam a maioria, (senão todas) das tags no html <meta name="keywords">. Motivo pelo qual acredito que ainda esteja lá seria por busca e indexação dos vídeos.

Para recuperá-las, procurei algum pacote do python para fazer o parse do html e me deparei com o
Beautiful Soup. Ele pode ser instalado com o comando dentro do seu ENV:

pip install BeautifulSoup

E também possui uma documentação bem completa no link: http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html

Criei uma def para fazer o trabalho, vamos a ela:


def get_tags(youtube_id):

	response = urllib2.urlopen('http://www.youtube.com/watch?v=%s' % youtube_id )
	html = str( response.read() )

	xmlSoup = BeautifulStoneSoup(html)

	tags = xmlSoup.findAll(attrs={"name" : "keywords"})[0]
	tags = str(tags)
	tags = tags.replace('\n','')

	return tags


Será retornado uma string com o conteúdo da tag meta keywords, sendo possível fazer todos os tratamentos necessários, como transformar em uma tupla, inserir no banco, etc.

Para outras tags, recomendo uma olhada na documentação do BeautifulSoup, pois tem várias formas de encontrar o que deseja.

hasta!

sexta-feira, 31 de agosto de 2012

Removendo acentos e caracteres especiais de nomes de arquivos durante o upload

Pior coisa para um programador, são nomes de arquivos com acentos, espaços e caracteres especiais. Pior que isso só os usuários malditos que insistem em continuar com esse procedimento infeliz.

Para resolver o problema de uma vez por todas, sempre que tiver um ImageField ou um FileField em seu model, utilize da seguinte maneira:
def retira_acento_upload(objeto, arquivo):
 """
 Essa função irá normalizar como um slug, o nome do arquivo que está sendo gravado e, irá gravá-lo
 em /media/uploads/APPNAME_CLASSNAME/ANO/nome_do_arquivo_normalizado.extensao
 """
 import os, datetime
 from django.template.defaultfilters import slugify
 caminho = str( '%s/%s/%s' % ( objeto._meta.app_label, objeto.__class__.__name__, datetime.datetime.now().year ) ).lower()
 nome, ext = os.path.splitext( arquivo )
 url = slugify( nome[:15] )
 return os.path.join( 'uploads', caminho, url+ext )

class SuaClasse(models.Model):
    ...
    arquivo = models.FileField(upload_to=retira_acento_upload)
    ...

Customize o return da def acima da maneira que desejar. No exemplo acima, o arquivo será enviado para uploads/<nome_da_app>/<nome_da_classe>/<ano_atual>/<nome_do_arquivo_nomalizado>.<extensão>

hasta!