-
-
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().unescapeOutra 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