[Python-de] mit RegEx text extrahieren?
Michael Janssen
Janssen at rz.uni-frankfurt.de
Fre Jul 4 20:15:08 EDT 2003
On Fri, 4 Jul 2003, Guenther Sommermann wrote:
>
> Ok, wenn das nicht so einfach geht, poste ich mal "ganz" genaue infos:
>
> Im Grunde will ich mir ein Skript schreiben, das Titel und URL der
> aktuellen Heise-News auf eine Website (soll nur lokal laufen)
> schreibt. (Im moment hol ich mir erstmal nur die URL.)
>
> (Vorweg: Das ganze könnte man wahrscheinlich am besten mit einem
> XML-Parser machen (hab ich mir auch shcon angeschaut), aber da ich
> grade erst anfange Python zu lernen is mir das noch zu hoch.....)
>
> Dazu les ich mir das rdf-File vom Heise Newsticker ein:
zufällig hab ich auch mal rdf's geparst (und ebenfalls ohne allzu große
Lust, viel xml Aufwand zu betreiben - aber wozu ganz ohne xml-parser?):
def get_channel(channel=1):
"""Wget and xml-parse rdf_file. Return string
This is completly different from the rest. Suggestion: don't try
to understand this and don't ask me, how it works. For me, it
works. That's all I've got to say to xml.
"""
from xml.dom.minidom import parse
try: rdf_file = channels[channel]
except IndexError:
eprint("List 'channels' provide no item No %s - using 0" \
% channel)
rdf_file = channels[0]
def getText(nodelist):
rc = ""
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc = rc + node.data
return rc
os.chdir(data_dir)
k = os.popen("wget -N "+rdf_file+" 2>&1").read()
if k.count("Server file no newer than local file"):
eprint(" No update for news available")
else: win.edited = 1
os.chdir(base_dir)
dom1 = parse(os.path.join(data_dir, os.path.basename(rdf_file)))
items_list = dom1.getElementsByTagName("item")
backl = []
for item in items_list:
#print "next item"
chlns = item.childNodes
for chln in chlns:
#print "next child"
try:
chln.data
except AttributeError: # no text node ---> interresting
backl.append(getText(chln.childNodes).encode("latin-1")+"\n")
backl.append("\n")
return backl
also xml.dom.minidom.parse über die Datei. Über das erhaltene DOM-Object
per getElementsByTagName() die "item" tags rausholen. Nunja, dann hab ich
mich anscheinend irgendwie durch die schier unendlich erscheinenden
Verschachtelungen gewurstelt und per brute-force nach "Child-Nodes"
gesucht, die kein "data"-Attribute haben. Diese dann nach Sub-Child-nodes
absuchen, die Text enthalten. Klappt. Mit heise und dem python-rdf
getestet.
Und weil es funktioniert, hatte ich mich auch nie mehr danach gefragt,
weshalb selbst ein *mini*-DOM so unendlich verschachtelt ausschaut.
Michael
PS: aktuelle Ausgabe von get_channel ist:
Quelloffener Java-Server JOnAS in Version 3.1
http://www.heise.de/newsticker/data/kav-04.07.03-000/
20 Jahre KHK
http://www.heise.de/newsticker/data/jk-04.07.03-009/
BBC dominiert European Online Journalism Award
http://www.heise.de/newsticker/data/ola-04.07.03-007/
debitel-Chef zufrieden mit bisherigem Jahresverlauf
http://www.heise.de/newsticker/data/jk-04.07.03-008/
Daten zu Euro-Banknoten-Fluss bleiben geschützt
http://www.heise.de/newsticker/data/ola-04.07.03-006/