[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