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.
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wie Textknoten mit lxml.etree finden?

Beitragvon snafu » Montag 15. September 2008, 16:05

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 15. September 2008, 16:15

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 Modvoice
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Montag 15. September 2008, 22:43

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?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 15. September 2008, 23:12

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 Modvoice
Benutzeravatar
snafu
User
Beiträge: 5389
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Dienstag 16. September 2008, 06:52

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...
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 16. September 2008, 08:33

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 Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder