Language
Lt :: En

Lecture 5 (2004-10-04)

This page is only available in Lithuanian

Darbas su Internetu

Standartinėje bibliotekoje yra realizuota nemažai Interneto protokolų.

urllib modulis leidžia atsidaryti web puslapį ar failą iš FTP serverio taip, tarsi tai būtų failas lokaliame diske:

import urllib

for line in urllib.urlopen('http://gedmin.as/python'):
    print line

urlopen funkcijos grąžinami objektai turi visus įprastinius metodus darbui su failais -- readline, read, close ir t.t. urllib moka dirbti su http, https, ftp ir kai kuriais kitais protokolais.

urllib2 modulis yra labai panašus į urllib, tačiau lengviau išplėčiamas. Jį apsimoka naudoti, jei norite apdoroti situacijas, su kuriomis urllib modulis nesusidoroja (cookies, nestandartiniai HTTP statuso kodai).

httplib modulis realizuoja HTTP protokolą. Naudokite jį, jei urllib jums yra per aukšto lygio.

Darbas su HTML duomenimis

Parsisiuntus puslapį reikia jį kažkaip apdoroti. Standartinė Python biblioteka pateikia nemažą rinkinį priemonių: HTMLParser, htmllib, sgmllib.

Štai kaip galima iškrapštyti visus paveiksliukus iš HTML dokumento naudojant sgmllib:

import sgmllib
import urllib

class MyParser(sgmllib.SGMLParser):

    def start_img(self, attrs):
        print dict(attrs)['src']

parser = MyParser()
parser.feed(urllib.urlopen('http://gedmin.as/python').read())
parser.close()

htmllib bei HTMLParser naudoti yra kiek nepatogiau, nes neveikia magija, leidžianti apsirašyti start_elementovardas metodus ir tenka žaisti su if sakiniais. Be to htmllib yra prisižaista aukštame abstrakcijos lygyje ir tenka vozotis su formatavimo bei rašymo klasėmis.

Darbas su XML duomenimis

Pythonas palaiko iš kitų programavimo kalbų kilusius DOM bei SAX standartus (nesu tikras, ar „standartas“ yra tinkamas žodis) darbui su XML duomenimis.

DOM (Document Object Model) iš XML duomenų failo sudaro rinkinį objektų atmintyje:

from xml.dom.minidom import parseString

xml_data = """
<studentai>
  <studentas vardas="Jonas" />
  <studentas vardas="Petras">
    <laptopas tipas="ThinkPad X31" />
    Paprastas tekstas.
  </studentas>
</studentai>
"""

dom = parseString(xml_data)

for student in dom.getElementsByTagName('studentas'):
    print student.getAttribute('vardas')

Dideli duomenų medžiai suryja daug atminties, tad jei mums nereikia viso medžio iškart, apsimoka apdoroti jį palaipsniui po vieną elementą:

from xml.dom.pulldom import parseString

xml_data = """
<studentai>
  <studentas vardas="Jonas" />
  <studentas vardas="Petras">
    <laptopas tipas="ThinkPad X31" />
    Paprastas tekstas.
  </studentas>
</studentai>
"""

for type, node in parseString(xml_data):
    if type == 'START_ELEMENT' and node.nodeName == 'studentas':
        print node.getAttribute('vardas')

Panašius privalumus turi xml.sax bei xmllib moduliai, bet vietoje vieno ciklo tenka rašyti savo klasę, kurios metodai bus iškvietinėjami iš standartinės bibliotekos gelmių.


Valid XHTML 1.1! Valid CSS! Last updated: 2012-01-08