[python] Python - taková skoro školní úloha

Radek Kanovsky rk na dat.cz
Úterý Červenec 30 15:20:28 CEST 2002


On Tue, Jul 30, 2002 at 12:37:32PM +0200, Jaroslav Lukesh wrote:

> Dobrý den,
> 
> potřebuji mít v pythonu (jako skript do Zope) program, který po zavolání s
> parametrem souboru, z něj ignoruje vše od začátku do <body cokoli> včetně,
> a od </body> včetně do konce souboru. Tedy dá na výstup jen text mezi <body
> cokoli>text</body>
>
> HTML Document product do Zope mi nepomůže, protože se dokument musí volat z
> URL a nikoli renderovat.
> 
> Koukal jsem do manuálu Pythónu a jsem z toho pythómy. V Basicu/Pascalu bych
> to napsal (po konzultaci s helpem, programoval jsem naposledy velmi dávno),
> ale pythonovská dokumentace jakoby některé věci neměla (nebo bad URL).
> 
> Kdyby se to povedlo, byl by to zajímavý variant pro HTML Document.

Jde to udelat velmi jednoduse vytvorenim DOM reprezentace HTML
dokumentu. Je to ale neefektivni a rychlejsi je pouzit nejaky SAX nebo
SGML parser, ale tohle zase funguje spolehlive i na ponekud nestandardni
HTML dokumenty a navic to ony "nestandardni" HTML dokumenty samo
znormalizuje. Tenhle postup vyzaduje mit nainstalovany modul PyXML.

-----------------------------------------------------------
#!/usr/bin/env python

import sys, xml, StringIO
from xml.dom.ext.reader import HtmlLib
from xml.dom.ext import PrettyPrint

def htmlbody (url) :
    result = StringIO.StringIO()
    reader = HtmlLib.Reader()
    doc = reader.fromUri(url)
    body = doc.getElementsByTagName("BODY")[0]
    for child in body._get_childNodes() :
        PrettyPrint(child, stream=result)
    return result.getvalue()
    

body = htmlbody(sys.argv[1])
print body
-----------------------------------------------------------


Priklad rychlejsi implementace po ruce bohuzel nemam, krome prastareho
kodu, ktery je trochu nerobustni, ale vetsinou funguje:

-----------------------------------------------------------
#!/usr/bin/env python

import string, sys

def htmlbody (file) :
    input = open(file).read()
    start = 0
    output = ''
    inbody = 0
    while start < len(input) -1 :
        ss = string.find(input, '<', start)
        if ss < 0 : break
        se = string.find(input, '>', start)
        if se < 0 : break
        tag = input[ss+1:se]
        tag = string.replace(tag,'\n',' ')
        tl = string.split(tag, ' ', 1)
        tl = map(lambda x : string.upper(string.strip(x)), tl)
        if tl[0] == 'BODY' : 
            inbody = 1
        elif tl[0] == '/BODY' : 
            output = output + input[start:ss]
            inbody = 0
        elif inbody : 
            output = output + input[start:se+1]
        start = se + 1
    return output

body = htmlbody(sys.argv[1])
print body
-----------------------------------------------------------


Zdravi

Radek Kaňovský


Další informace o konferenci Python