Skip to content

Instantly share code, notes, and snippets.

@flavioamieiro
Created March 20, 2012 03:08
Show Gist options
  • Save flavioamieiro/2130649 to your computer and use it in GitHub Desktop.
Save flavioamieiro/2130649 to your computer and use it in GitHub Desktop.
Script para buscar o título da página e formatar um tweet
#!/usr/bin/python3
#-*- coding: utf-8 -*-
import sys
import re
import urllib.request
from html.parser import HTMLParser
def usage():
sys.stderr.write("usage: {0} <url>\n".format(sys.argv[0]))
sys.exit(1)
try:
url = sys.argv[1]
except IndexError:
usage()
title_regex = b'<title.*>(.*?)<\/title>'
content = urllib.request.urlopen(url).read()
# re.DOTALL makes . match newlines
matches = re.search(title_regex, content, re.IGNORECASE | re.DOTALL)
title = matches.group(1).decode('utf-8').replace('\n', '').strip()
title = HTMLParser().unescape(title)
endchar = '\n' if sys.stdout.isatty() else ''
sys.stdout.write('{0} - {1}{2}'.format(title, url, endchar))
@rhcarvalho
Copy link

Oi! Ao invés de

matches.groups()[0]

você pode usar

matches.group(1)

E cuidado com o .decode('utf-8'), só funciona se a string estiver codificada em UTF-8 ou compatível. Mas pra um script pequenino tá bom né? Pra que complicar :)
Se não atender a demanda, implementa o que for necessário -- quando necessário!

Abraço,

Rodolfo

@flavioamieiro
Copy link
Author

Boa Rodolfo!

Não sabia que o groups() aceitava argumentos. Falta documentação inline pra ele (e eu devo ter ficado com preguiça de ler tudo) Docstring: <no docstring> é feião.

Eu fiz o script do jeito mais simples possível. Já tive até que corrigir outro bug nele uns dias atrás (antes de postar aqui). Ele não encontrava o título da página quando este tinha quebras de linha no meio. Resolvi passando a flag re.DOTALL e removendo as quebras de linha na hora de formatar a saída.

Na verdade ainda tem um bug aí. Se a página não tiver título ele levanta uma exceção. matches vai ser None, e aí matches.groups() vai ser inválido.

@rhcarvalho
Copy link

A documentação in-line do método group deixa a desejar mesmo...

In [3]: help(re.match('.(.)', 'abc').group)
Help on built-in function group:

group(...) 

@flavioamieiro
Copy link
Author

Eu percebi isso logo depois, e editei o script aí em cima.

@flavioamieiro
Copy link
Author

@rhcarvalho tem algum jeito melhor de fazer esse unescaping do que essa gambiarra aí?

@rhcarvalho
Copy link

Engraçado que o GitHub não me notificou... gostei desse sistema novo de notificações, mas essa não é a primeira esquisitice que acontence....

Como conversamos hoje, faz:

from HTMLParser import HTMLParser
unescape = HTMLParser().unescape

Outra dica é usar o argparse

@turicas
Copy link

turicas commented Sep 25, 2012

urllib.request.urlopen(url).read() poderia ser urllib.urlopen(url).read()
O requests já resolve alguns dos probleminhas, como detetar encoding e tal.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment