2016-07-09 12 views
1

Ich stoße auf ein Problem, wenn ich versuche, den Elternknoten eines tr-Elements zu erhalten, während ich sie alle durchlaufe.Python lxml iteriert durch tr-Elemente

Hier ist eine grundlegende Tabelle, mit der ich arbeite.

<table border=1> 
    <tbody> 
    <tr> 
    <td> 
    <p>Some text</p> 
    </td> 
    <td> 
    <p>Some more text</p> 
    </td> 
    </tr> 
    <tr> 
    <td> 
    <p> Some more text</p> 
    </td> 
    <td> 
    <p> Some more text</p> 
    </td> 
    </tr> 
    <tr> 
    <td> 
    <p> Some more text</p> 
    </td> 
    <td> 
    <p> Some more text</p> 
    </td> 
    </tr> 
    </tbody> 
    </table> 

Und hier ist mein Python-Skript den übergeordneten Knoten mit lxml

import lxml.html 

htm = lxml.html.parse('plaintable.htm') 
tr = htm.xpath('//tr') 
for x in tr: 
    tbody = tr.getparent() 
    if tbody.index(tr) == 1: 
     print ('Success!') 
print ('Finished') 

Ich erhalte diesen Fehler zu bekommen, wenn ich das Skript ausführen: Attribute: ‚list‘ Objekt hat kein Attribut ‚GetParent '

Ich bin ziemlich neu in Python, so dass es etwas Einfaches sein könnte ich vermasseln. Ich habe die lxml-Dokumente gelesen und konnte keine Antwort finden.

Jede Hilfe wäre großartig!

Antwort

1

tr ist eigentlich eine Liste der xpath Übereinstimmungen. x entspricht einzelnen tr Elemente - statt auf sie getparent() Methode aufrufen:

tr = htm.xpath('//tr') 
for x in tr: 
    tbody = x.getparent() 
    # ... 

Obwohl, ich sehe nicht viel Sinn, in die gleichen Eltern über immer und immer wieder in einer Schleife, falls Sie einen einzelnen table haben und tbody Element. Warum suchen Sie nicht vorher:

tbody = htm.xpath("//tbody")[0] 
for x in tbody.xpath(".//tr"): 
    # ... 

I need to find the first tr in every table to build it properly

Was diese - ich würde alle table Elemente iterieren und finden Sie das erste tr Element:

tables = htm.xpath("//table") 
for table in tables: 
    first_tr = table.xpath(".//tr")[0] 
+0

Ah perfekt! Ich habe falsch verstanden, wie man den Index in der for-Schleife aufruft. Ich bin an JavaScript gewöhnt, also hatte ich eine harte Zeit. Kurz gesagt, ich baue eine XML-Datei basierend auf den Tabellen im HTML-Dokument. Ich arbeite derzeit mit 36 ​​verschiedenen Tischen. Ich muss den ersten tr in jeder Tabelle finden, um es richtig zu bauen – Chad

+0

@Chad bekam es, auch aktualisiert mit einem Beispielcode für die "Ich muss den ersten tr in jeder Tabelle finden, um es richtig zu bauen" Teil. Vielen Dank! – alecxe

+0

Ehrfürchtig, das wird sehr hilfreich beim Erstellen der Elternknoten sein. Ich schätze deine Hilfe sehr! – Chad