Interfete Evoluate

Unelte de prelucrare a documentelor structurate

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.

Doua dintre API-urile de baza si cele mai des folosite pentru extragerea datelor din XML sunt interfetele SAX si DOM. Acestea difera semnificativ si determinarea interfetei
care trebuie folosita intr-o anumita aplicatie este un lucru foarte important. SAX defineste o interfata de nivel jos care este usor de folosit de catre parserele XML dar cere
programatorului sa gestioneze mai multe detalii.Ofera insa avantajul unui overhead redus : nu sunt construite structuri de date mari decat daca aplicatia are nevoie.Acest lucru
duce la sporirea vitezei de prelucrarea si de asemenea permite procesarea eficienta a documentelor mari.Acest lucru este realizat datorita unei interfete bazata pe evenimente.
Folosirea SAX este asemanatoare cu procesarea evenimentelor generate de un utilizator la intrarea standard si apoi manipularea unei structuri de date anterior construita.

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.

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

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.

Prezentam acum crearea dictionarului care asociaza numerele isbn titlurilor cartilor dar cu 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)

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.
 

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.

 

Blog





Cel mai cuprinzator director romanesc  Director Web Romania - LinkWeb.ro - Adauga si site-ul tau