python 8


Kurs języka Python
Wykład 8.
Przetwarzanie tekstu

Wyrażenia regularne

Biblioteka urllib

Parsowanie html'a

XML
Wyrażenia regularne
c:\> dir *.exe
$ rm *.tmp
Wyrażenia regularne

'alamakota'

'(hop!)*'
{ '', 'hop!', 'hop!hop!',... }

'br+um'
{ 'brum', 'brrum', 'brrrum' }
Algorytm rozpoznawania
wyrażenia regularnego
Automat
Wyszukiwanie a dopasowanie
import re
automat = re.compile('brr+um')
if automat.match('brrrrum!!!'): print 'pasuje'
if automat.search('Autko robi brrrrum!!!'):
print 'pasuje'
Klasa MatchObject
res = automat.search('brrrum!!!')

res.group() # dopasowany tekst

res.span() # para (początek, koniec)
Większe zadanie
Znalezć na stronie html'owej wszystkie odwołania
do innych stron
Opis odwołania
www.ii.uni.wroc.pl
adres = '([a-zA-Z]+\.)*[a-zA-Z]+'
http = 'http:\\' + adres
automat = re.compile(http)
tekst = fh.read()
Lista wszystkich odwołań
[ url.group() for url in automat.finditer(tekst) ]
Przegląd metaznaków

|

{m,n}

{m}

.

?

^
Skróty

\d  dowolna cyfra

\w  znak alfanumeryczny (zależy od ustawień
LOCALE)

\Z  koniec napisu
Problem z ukośnikiem \
'Imię\tNazwisko\n'
print 'Tabulator to znak \\t'
'c:\\WINDOWS\\win.ini'
\ w wyrażeniach regularnych
Zagadka:
Jak znalezć w tekście '\['
Próby rozwiązania
re.match('\[', '\[')
re.match('\\[', '\[')
re.match('\\\[', '\[') # błąd!!!
re.match('\\\\[', '\[') # błąd!!!
re.match('\\\\\[', '\[') # !!!
Inne rozwiązanie
Raw tekst:
re.match(r'\\\[', '\[')
Grupowanie wyrażeń
Zadanie: z daty w formacie '20061204'
wyciągnąć dzień, miesiąc i rok.
Wyrażenie grupujące
(?Pregexp)
Trochę więcej o grupach
tekst = 'abbabbba'
wzor = 'a(b*)a.*(a)'
aut = re.compile(wzor)
res = aut.match(tekst)
print res.groups()
Wynik: ('bb', 'a')
Rozwiązanie
tekst = '20061204'
wzor =
r'(?P\d{4})(?P\d{2})(?P\d{2})'
aut = re.compile(wzor)
res = aut.search(tekst)
print res.group('rok'), res.group('mies')
Ściąganie stron przez http i https
import urllib
in_stream = urllib.urlopen('http://www.python.org')
doc = in_stream.read()
in_stream.close()
Strumień

in_stream.readlines()

for line in in_stream: print line,
Parsowanie html
import sgmllib
class sgmllib.SGMLParser:
def start_tag(self, attrs):
def end_tag(self):
Przykładowa implementacja
class MyParser(sgmllib.SGMLParser):
def start_a(self, attrs):
for (atr, val) in attrs:
if atr == 'href': print val
Uruchomienie
p = MyParser()
p.feed(doc)
p.close()
XML
Extensible Markup Language
Przykład



Ascher, Martelli, Ravenscroft
Python. Receptury



Python. Od podstaw


SAX - Simple API for XML
Schemat przetwarzania:

Elementy pliku są kolejno wczytywane

Dla każdego elementu wywoływana jest
odpowiednia funkcja
From xml.sax import *
class saxutils.DefaultHandler:
def startElement(self, name, attrs): pass
def startDocument(self): pass
def endElement(self, name): pass
def endDocument(self): pass
def characters(self, value): pass
Schemat programu
class SaxReader(saxutils.DefaultHandler):
def characters(self, value):
print value
Start element
def startElement(self, name, attrs):
for x in attrs.keys():
print x, '=', attrs[x]
Inicjowanie
from xml.sax import make_parser
from xml.sax.handler import
feature_namespaces
from xml.sax import saxutils
parser = make_parser()
parser.setFeature(feature_namespaces, 0)
dh = SaxReader()
parser.setContentHandler(dh)
parser.parse(fh)
Cechy SAX

Przetwarzanie w trybie 'do odczytu'

Przetwarzanie liniowe

SAX jest szybki, nie wymaga dużej pamięci
Document Object Model (DOM)

Dokument jest pamiętany w całości jako drzewo

Dokument (drzewo) można modyfikować

Przetwarzanie sporo czasu i pamięci, całe
drzewo jest przechowywane w pamięci
Utworzenie drzewa
import xml
doc = xml.dom.minidom.parse('content.xml')
Klasa Node - atrybuty
nodeType
nodeName
nodeValue
parentNode
childNodes
firstChild
lastChild
previousSibling
nextSibling
attributes
Modyfikacja drzewa
appendChild(newChild)
removeChild(oldChild)
replaceChild(newChild, oldChild)
Tworzenie nowych węzłów
new = document.createElement('chapter')
new.setAttribute('number', '5')
document.documentElement.appendChild(new)
Iterator po drzewie
from xml.dom.NodeFilter import NodeFilter
reader = Sax2.Reader()
doc = reader.fromStream(open('plik.xml', 'r'))
Iterator po drzewie
walker =
doc.createTreeWalker(doc.documentElement,
NodeFilter.SHOW_ALL, None, 0)
while 1:
print walker.currentNode.nodeName
next = walker.nextNode()
if next is None: break
XPath
Selekcja ścieżek w drzewie
Xpath - przykład
from xml import xpath
nodes = xpath.Evaluate('ksiazka/autor',
doc.documentElement)
KONIEC


Wyszukiwarka

Podobne podstrony:
Python Od podstaw
Monty Python I Święty Graal (Monty Python And The Holy Grail) [1975]
python
Python wyklad
Monty Python Jabberwocky 1977
instr khe python
slowniki w pythonie
python 9
PYTHON V1instal

więcej podobnych podstron