2016-04-02 4 views
0

Looping durch habe ich folgendes XPath:td Kinder eines tr Element in Python lxml

errors = root.xpath('/html/body/div[3]/form/table[4]/tr[2]/text()') 

Innerhalb dieses HTML (einige für weniger entfernten Teile eines großen Beispiel)

... 
<TABLE CLASS="datadisplaytable" SUMMARY="This layout table is used to present Registration Errors."> 
    <TR> 
    <TH CLASS="ddheader" scope="col" >Status</TH> 
    <TH CLASS="ddheader" scope="col" ><ACRONYM title = "Course Reference Number">CRN</ACRONYM></TH> 
    <TH CLASS="ddheader" scope="col" ><ABBR title = Subject>Subj</ABBR></TH> 
    <TH CLASS="ddheader" scope="col" ><ABBR title = Course>Crse</ABBR></TH> 
    <TH CLASS="ddheader" scope="col" ><ABBR title = Section>Sec</ABBR></TH> 
    <TH CLASS="ddheader" scope="col" >Level</TH> 
    <TH CLASS="ddheader" scope="col" ><ABBR title = "Credit Hours">Cred</ABBR></TH> 
    <TH CLASS="ddheader" scope="col" >Grade Mode</TH> 
    <TH CLASS="ddheader" scope="col" >Title</TH> 
    </TR> 
    <TR> 
    <TD CLASS="dddefault">DUPLICATE <ACRONYM title = "Course Reference Number">CRN</ACRONYM></TD> 
    <TD CLASS="dddefault">33587</TD> 
    <TD CLASS="dddefault">UNIV</TD> 
    <TD CLASS="dddefault">E101</TD> 
    <TD CLASS="dddefault">941</TD> 
    <TD CLASS="dddefault">Undergraduate Quarter</TD> 
    <TD CLASS="dddefault">&nbsp;</TD> 
    <TD CLASS="dddefault">&nbsp;</TD> 
    <TD CLASS="dddefault">The Drexel Experience</TD> 
    </TR> 
    </TABLE 
> 
.... 

Der Ausgang ich bekomme ist:

['\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n'] 

Was interessant ist, ist, wenn ich die genaue td Index nach dem 012 angeben, wie der folgende Code, erhalte ich Ausgabe:

errors = root.xpath('/html/body/div[3]/form/table[4]/tr[2]/td[1]/text()') 

Der Ausgang:

['DUPLICATE '] 

Es scheint, wie ich in einer Schleife durch die Liste müssen, so habe ich versucht, diese, die auch nicht funktionierte.

for error in errors: 
    print error 
+0

warum die Auswahl von Text() auf der tr, wenn Sie durch seine iterieren wollen Kinder td? Sie könnten einfach './table/tr' verwenden, um die Zeilen zu erhalten, und dann für jede Zeile' td', um die Daten auszuwählen. – postelrich

Antwort

3

Es ist nicht klar, was die Frage ist, aber hier ist ein Blick auf was Ihre XPath-Ausdrücke tun.

/text() gibt Textknoten zurück, die direkte Kind des aktuellen Kontext Kontext Node ist. So, tr[2]/text() gibt Textknoten zurück, die direkte Kind des 2. tr sind, die nur Leerzeichen und Zeilenumbrüche sind.

nun die oben Kontrast mit tr[2]/td[1]/text(), die Textknoten zurück, die direkte Kind ist des ersten td in der 2. tr. So erhalten Sie die Ausgabe 'DUPLICATE '.

+0

Entschuldigung, wenn es unklar ist. Ich möchte grundsätzlich alle Textknoten drucken, die direkt an erster Stelle des zweiten "tr" stehen, also "DUPLICATE 33587 UNIV E101 .." in einer Zeile. – theGreenCabbage

+0

in diesem Fall können Sie Ihren XPath an der 'td' stoppen und in eine Zeichenfolge umwandeln, etwa so:' string (...../tr [2]/td [1]) ' – har07

+0

Sie meinen wie' str (root.xpath ('/ html/body/div [3]/form/tabelle [4]/tr [2]/td [1]')) '? Das gibt nur '[]':/ – theGreenCabbage

0

Wenn Sie den Inhalt aller td-Tags in der Sekunde erhalten tr Sie folgende XPath verwenden können:

errors = root.xpath('/html/body/div[3]/form/table[4]/tr[2]/td/text()') 
Verwandte Themen