Wie Textknoten mit lxml.etree finden?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hi!

Ich habe diesen Code mit html5lib geparst:

Code: Alles auswählen

html = '<html><span><b>bold</b> after bold</span><span>normal</span></html>'
Ich möchte nun den String after bold zurückbekommen. Als Neuling bin ich mir aber nicht sicher wie ich das anstellen kann. Ich habe schon probiert alle Textknoten, die Nachfahren von span-Elementen sind, zu scrapen, bin aber nicht sicher ob das so richtig ist:

Code: Alles auswählen

for elem in doc.findall('.//child::span::text()'): print elem


Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    for elem in doc.findall('.//child::span::text()'): print elem
  File "lxml.etree.pyx", line 1701, in lxml.etree._ElementTree.findall (src/lxml/lxml.etree.c:16145)
  File "lxml.etree.pyx", line 1303, in lxml.etree._Element.findall (src/lxml/lxml.etree.c:12800)
  File "C:\Python25\Lib\site-packages\lxml\_elementpath.py", line 225, in findall
    return list(iterfind(elem, path))
  File "C:\Python25\Lib\site-packages\lxml\_elementpath.py", line 200, in iterfind
    selector = _build_path_iterator(path)
  File "C:\Python25\Lib\site-packages\lxml\_elementpath.py", line 184, in _build_path_iterator
    selector.append(ops[token[0]](_next, token))
KeyError: '::'
Ich habe das auf Grundlage von Artikeln zu XPath gemacht, die aber nicht explizit in Verbindung zu lxml standen. Wird diese Syntax vielleicht auch gar nicht von lxml implementiert? Dann würde ich mich über Alternativvorschläge freuen. :)

Gruß

Sebastian
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Code: Alles auswählen

import lxml.html
doc = lxml.html.fromstring('<html><span><b>bold</b> after bold</span<span>normal</span></html>')
print doc.cssselect('span > b')[0].tail
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Danke, ich löse es in meinem Skript jetzt so. Gibt es eigentlich eine elegantere Lösung als diese tostring/fromstring Variante für jedes Element?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snafu hat geschrieben: Gibt es eigentlich eine elegantere Lösung als diese tostring/fromstring Variante für jedes Element?
Einfach die Elemente nutzen statt sie dauernd in Text und hin und her konvertieren.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Leonidas hat geschrieben:
snafu hat geschrieben: Gibt es eigentlich eine elegantere Lösung als diese tostring/fromstring Variante für jedes Element?
Einfach die Elemente nutzen statt sie dauernd in Text und hin und her konvertieren.
Das war natürlich mein erster Gedanke, aber ich habe noch nicht rausgefunden wie ich sozusagen den lxml.etree-Knoten in einen lxml.html-Knoten umwandle, ohne den Umweg über Strings zu gehen. :(

EDIT: Okay, falsch rum gedacht. Ich hatte angenommen, tail gäbe es nur bei lxml.html und wusste anfangs auch gar nicht so richtig was es tut. Da zeigt sich wieder mal mein Anfängerwissen hinsichtlich ElementTree...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Just for the record: lxml.html ist nur ein Parser, raus kommt, wie bei html5lib etc immer ein ElementTree.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten