Seite 1 von 1

Wie Textknoten mit lxml.etree finden?

Verfasst: Montag 15. September 2008, 16:05
von snafu
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

Verfasst: Montag 15. September 2008, 16:15
von Leonidas

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

Verfasst: Montag 15. September 2008, 22:43
von snafu
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?

Verfasst: Montag 15. September 2008, 23:12
von Leonidas
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.

Verfasst: Dienstag 16. September 2008, 06:52
von snafu
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...

Verfasst: Dienstag 16. September 2008, 08:33
von Leonidas
Just for the record: lxml.html ist nur ein Parser, raus kommt, wie bei html5lib etc immer ein ElementTree.