Daniel Baluta
Unelte de prelucrare a documentelor structurate Scopul acestui articol este de a face o scurta prezentare a modulelor existente in Python folosite pentru prelucrarea datelor structurate.Printre acestea regasim module care lucreaza cu Standard Generalized Markup Language (SGML) si Hypertext Markup Language (HTML) de asemenea exista si cateva interfete pentru lucrul cu Extensible Markup Language (XML).De asemenea ne propunem sa facem o prezentare detaliata a unora dintre aceste module.Limbajul Python este un limbaj orientat pe obiecte,interpretat,portabil,usor de inteles , interactiv elegant,extensibil.Se pot adauga noi facilitati cu ajutorul modulelor.In continuare vom prezenta cele mai importante module si interfete existente pentru prelucrarea datelor adnotate cu marcaje impreuna cu o scurta descriere a lor.
SAX defineste un numar de interfete handler pe care aplicatia le poate implementa pentru a primi evenimente.Metodele acestor obiecte sunt apelate atunci cand evenimentele corespunzatoare sunt intalnite in XML-ul care este parsat.Fiecare metoda poate fi gandita ca fiind exact evenimentul care se produce.Evenimentele se impart in : continut,tip de document,lexical si evenimente de eroare.Fiecare categorie de evenimente este prelucrata folosind o interfata diferita.Aplicatia poate specifica exact pentru care dintre categoriile de evenimente este interesata prin implementarea in parser a metodelor corespunzatoare si excluzandu-le pe cele de care nu are nevoie.Suportul Python pentru XML ofera clase de baza care permit implementarea doar a metodelor de care aplicatia are nevoie, restul de metode avand continut vid. Evenimentele cele mai des intalnite sunt cele referitoare la continut, in cadrul acestora cele mai importante fiind startElement,characters si endElement.
Vom prezenta un exemplu simplu de folosire SAX pentru extragerea de informatie utila dintr-un document.Pentru aceasta ne vom folosi de documentul XML de mai jos.
Daca dorim sa cream un dictionar care asociaza numerele date in atributul ISBN cu
titlurile cartii vom crea un handler de continut care va astepta pentru aparitia
elementului book.
<catalog>
<book isbn="1-23232-0-1">
<title> Nopti albe >
<author>Fiodor Dostoevski >
</book>
<book isbn-"2-32984-1-2">
<title>Faptele iubirii >
<author>Soren Kierkegaard >
</book>
</catalog>
DOM-ul este opus SAX-ului in sensul ca SAX ofera o "fereastra" redusa care trece peste
document-ul de intrare bazandu-se pe aplicatie sa deduca restul in timp ce DOM ofera tot documentul aplicatiei
care isi extrage prin mijloace proprii informatiile.Spre deosebire de SAX unde se raportau evenimente
individuale aplicatiei in timp ce parserul intalnea constructiile specifice in document , in cazul DOM aplicatia
creaza un obiect care reprezinta intregul document ca o structura ierarhica.DOM-ul ofera obiecte denumite noduri
care reprezinta parti din document.Exista mai multe tipuri de noduri , fiecare folosit pentru un anumit tip de constructie
Nodurile din DOM nu corespund evenimentelor din SAX desi multe sunt asemanatoare.In SAX un element este reprezentat
prin evenimentele de start si end iar continutul este reprezentat de toate evenimentele ce vin intre start in timp
ce in DOM-ul ofera un singur obiect care reprezinta elementul si ofera metode care permit aplicatiei sa obtina nodurile
fii care reprezinta continutul elementului.
import xml.sax.handler
class BookHandler(xml.sax.handler.ContentHandler):
def __init__(self):
self.inTitle = 0
self.mapping = {}
def startElement(self, name, attributes):
if name == "book":
self.buffer = ""
self.isbn = attributes["isbn"]
elif name == "title":
self.inTitle = 1
def characters(self, data):
if self.inTitle:
self.buffer += data
def endElement(self, name):
if name == "title":
self.inTitle = 0
self.mapping[self.isbn] = self.buffer
Extragerea informatiei devine acum triviala :
#cream parser-ul
>>> parser = xml.sax.make_parser( )
#cream handler-ul
>>> handler = bookhandler.BookHandler( )
#asociem handler-ul cu parser-ul
>>> parser.setContentHandler(handler)
#apelam metoda parse
>>> parser.parse("books.xml")
#afisam rezultatele
>>> pprint.pprint(handler.mapping)
Prezentam acum crearea dictionarului care asociaza numerele isbn titlurilor cartilor dar cu DOM
Este evident ca avem de a face cu lucruri foarte diferite aici. Desi numarul de linii de cod este comparabil , este
foarte dificila scriera de cod reutilizabil cu DOM , in timp ce cu SAX trebuie modificata doar o mica parte dintr-un
handler . Ceea ce ofera DOM-ul in compensatie este usurinta de accesare a oricarei parti din document avand tot
documentul mapat intr-un obiect.
In concluzie , alegerea uneia dintre metodele de mai sus depinde de tipul de informatie prelucrata.Daca informatia
este structurata intr-un asa fel incat sa se poate crea usor o asociere intre un element si o actiune atunci SAX
se recomanda a fi folosit insa daca datele se reprezinta foarte usor ca un arbore atunci ar trebui folosit DOM.
mapping = {}
for node in doc.getElementsByTagName("book"):
isbn = node.getAttribute("isbn")
L = node.getElementsByTagName("title")
for node2 in L:
title = ""
for node3 in node2.childNodes:
if node3.nodeType == Node.TEXT_NODE:
title += node3.data
#dupa rulare mapping are acelasi valori ca si in examplul SAX
pprint.pprint(mapping)
Bine ati venit!
Acesta este siteul proiectului nostru la cursul de Interfete Evoluate.
Din meniu aveti acces catre aplicatii dezvoltate de membrii echipei, articole cu informatii utile despre tehnologiile folosite, resurse de unde putetii obtine mai multe informatii despre acest domeniu precum si o lista de programe gratuite de care ne-am folosit pe parcurs.