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
(?P
regexp)
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