-
-
Save flavioamieiro/2130649 to your computer and use it in GitHub Desktop.
#!/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)) |
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.
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(...)
Eu percebi isso logo depois, e editei o script aí em cima.
@rhcarvalho tem algum jeito melhor de fazer esse unescaping do que essa gambiarra aí?
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
urllib.request.urlopen(url).read()
poderia ser urllib.urlopen(url).read()
O requests já resolve alguns dos probleminhas, como detetar encoding e tal.
Oi! Ao invés de
você pode usar
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