Slides em HTML5: http://fgmacedo.github.io/talks/pybr9_raspador
Palestra apresentada na PythonBrasil[9], em Brasília.
Com aproximadamente 500 linhas de código (+testes), o raspador é uma mini-biblioteca para extração de dados em fontes semi-estruturadas. Está em produção utilizado como fundamento para extração de dados em Espelhos MFD de impressoras fiscais.
A definição dos extratores é feita através de classes como modelos, de forma semelhante ao ORM do Django. Cada extrator procura por um padrão especificado por expressão regular, e a conversão para tipos primitidos é feita automaticamente a partir dos grupos capturados.
O analisador é implementado como um gerador, onde cada item encontrado pode ser consumido antes do final da análise, caracterizando uma pipeline.
A análise é foward-only, o que o torna extremamente rápido, e deste modo qualquer iterador que retorne uma string pode ser analisado, incluindo streams infinitos.
Com uma base sólida e enxuta, é fácil construir seus próprios extratores.
Além da utilidade da ferramenta, o raspador é um exemplo prático e simples da utilização de conceitos e recursos como iteradores, geradores, meta-programação e property-descriptors.
http://2013.pythonbrasil.org.br/program/pb/other/raspador-uma-mini-biblioteca-tupiniquim-para-extracao-de-dados
10. PLAIN PYTHON + REGEX
Fácil de escrever
Difícil de manter
Write only code
11. O que faz?
rs=[
e
]
frlnai etaasltie(:
o ih n nrd.pilns)
i ntlna
f o ih:
cniu
otne
ie ={
tm
}
frprei lnaslt)
o at n ih.pi(:
k v=preslt''
,
at.pi(:)
ie[]=v
tmk
rsapn(tm
e.pedie)
Você entende o código, mas não tem significado.
12. REGULAR EXPRESSIONS
Some people, when confronted with a problem,
think "I know, I'll use regular expressions." Now
they have two problems. (Jamie Zawinski, 1997)
13. I [:
n ]
#Oqeis fz
u so a?
rgx="((!$&*/?_{}]|[#%'+-=^
ee
^([#%'+-=^`|~w)(!$&*/?_
`|~w[#%'+-=^`|~.w{,[#%'+-=^`
{}]!$&*/?_{}]0}!$&*/?_{
|~w)[]w(-]w)+[.+*$
}])@+[.+*.w(-]w))"
Email validation - RFC 2821, 2822 compliant
16. pessoa_parser.py
fo rsao ipr Pre
rm apdr mot asr
fo rsao ipr SrnFed Itgril
rm apdr mot tigil, neeFed
casPreDIfraosesasPre)
ls asrenomcePsoi(asr:
Nm =SrnFedrNm:(*'
oe
tigil('oe .))
Iae=Itgril('+ ao'
dd
neeFedr(d) ns)
A definição de um atributo e o tipo de dado agregam semântica
17. pessoa.txt
Nome: Guido van Rossum
Guido van Rossum é um programador de
computadores dos Países Baixos que é mais
conhecido por ser o autor da linguagem de
programação Python. Wikipédia
Nascimento: 31 de janeiro de 1956 (57 anos),
Países Baixos
Cônjuge: Kim Knapp (desde 2000)
Educação: Universidade de Amsterdã (1982)
Filho: Orlijn Michiel Knapp-van Rossum
Irmão: Just van Rossum
18. pessoa_utilizacao.py
fo pso_asripr PreDIfraosesas
rm esapre mot asrenomcePsoi
pre =PreDIfraosesas)
asr
asrenomcePsoi(
wt oe(pso.x' a f
ih pn'esatt) s :
frpso i pre.as()
o esa n asrpref:
pitpso.oe
rn(esaNm)
pitpso.dd)
rn(esaIae
Guido van Rossum
57
19. #pre.as rtrau gnrtr
asrpre eon m eeao
wt oe(pso.x' a f
ih pn'esatt) s :
g=pre.as()
asrpref
pittp()
rn(yeg)
pitnx()
rn(etg)
<ye'eeao'
tp gnrtr>
Dcinr((Nm' 'ud vn
itoay['oe, Gio a
Rsu',(Iae,5))
osm) 'dd' 7]
20. RASPADOR.ITEM
casDcinr(reeDc)
ls itoayOdrdit:
""
"
Dcinr ta epssky a poete fr
itoay ht xoe es s rpris o
es ra acs.
ay ed ces
""
"
df_gttr_sl,nm)
e _eat_(ef ae:
i nm i sl:
f ae n ef
rtr sl[ae
eun efnm]
rieAtiuero(
as trbtErr
"swtotat 's"%
% ihu tr %'
(yesl)_nm_,nm)
tp(ef._ae_ ae)
21. CAMPOS BUILT-IN
fo rsao ipr (
rm apdr mot
BsFed Itgril,
aeil, neeFed
SrnFed Boenil,
tigil, olaFed
Fotil,BFotil,
laFed RlaFed
DtFed DtTmFed
aeil, aeieil)
TODO: B F o t i l , definir sistema de localização.
RlaFed
27. NEM TUDO QUE É TEXTO
... está em texto
pdftotext
Dica:
pfoet-aot<ruv.d>
dttx lyu aqiopf
Mantém a estrutura do arquivo gerado próxima com o original.
30. TESTES
Testes automatizados com tox.
$tx
o
Bibliotecas de terceiros para os testes são instaladas
automaticamente no ambiente virtual da versão do Python:
ns=130
oe=..
cvrg=36
oeae=.
fae=20
lk8=.