[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/