Python, lxml und xpath – html Tabellenanalyse

Ich bin neu in lxml, ganz neu in python und konnte keine Lösung für die folgenden finden:

Ich muss ein paar Tabellen mit 3 Spalten und eine undefinierte Anzahl von Zeilen ab Zeile 3 importieren.

Wenn die zweite Spalte einer Zeile leer ist, wird diese Zeile verworfen und die Verarbeitung der Tabelle wird abgebrochen.

Der folgende Code druckt die Daten der Tabelle gut (aber ich kann die Daten danach nicht wiederverwenden):

from lxml.html import parse def process_row(row): for cell in row.xpath('./td'): print cell.text_content() yield cell.text_content() def process_table(table): return [process_row(row) for row in table.xpath('./tr')] doc = parse(url).getroot() tbl = doc.xpath("/html//table[2]")[0] data = process_table(tbl) 

Dies druckt nur die erste Spalte 🙁

 for i in data: print i.next() 

Das folgende importiert nur die dritte Zeile und nicht die nachfolgende

 tbl = doc.xpath("//body/table[2]//tr[position()>2]")[0] 

Jeder kennt eine fancy Lösung, um alle Daten aus Zeile 3 in tbl zu bekommen und es in ein Array zu kopieren, damit es zu einem Modul ohne lxml Abhängigkeit verarbeitet werden kann?

Vielen Dank im Voraus für deine Hilfe, Alex

2 Solutions collect form web for “Python, lxml und xpath – html Tabellenanalyse”

Dies ist ein Generator:

 def process_row(row): for cell in row.xpath('./td'): print cell.text_content() yield cell.text_content() 

Du nennst es so, als hättest du gedacht, dass es eine Liste zurückgibt. Das geht nicht Es gibt Kontexte, in denen es sich wie eine Liste verhält :

 print [r for r in process_row(row)] 

Aber das ist nur, weil ein Generator und eine Liste beide die gleiche Schnittstelle for Loops aussetzen. Verwenden Sie es in einem Kontext, in dem es nur einmal ausgewertet wird, zB:

 return [process_row(row) for row in table.xpath('./tr')] 

Ruft nur eine neue Instanz des Generators einmal für jeden neuen Wert der row und gibt das erste Ergebnis zurück.

Also das ist dein erstes problem Ihr zweites ist das, was du erwartest:

 tbl = doc.xpath("//body/table[2]//tr[position()>2]")[0] 

Um dir die dritte und alle nachfolgenden Reihen zu geben, und es ist nur die Einstellung der tbl in die dritte Zeile. Nun, der Aufruf von xpath kehrt die dritte und alle nachfolgenden Zeilen zurück. Es ist der [0] am Ende, der dich verwirrt.

Sie müssen eine Schleife verwenden, um auf die Daten der Zeile zuzugreifen, wie folgt:

 for row in data: for col in row: print col 

Wenn du als nächstes aufrufst (), sobald du gehst, greife nur auf das erste Element zu, weswegen du eine Spalte siehst.

Beachten Sie, dass Sie aufgrund der Art der Generatoren nur einmal auf sie zugreifen können. Wenn Sie den Aufruf process_row(row) in die list(process_row(row)) , würde der Generator in eine Liste umgewandelt werden, die wiederverwendet werden kann.

Update: Wenn du nur die 3. Zeile benötigst, brauchst du die data[2:]

  • Iterate durch alle Zeilen in einer Tabelle mit python lxml xpath
  • Wie lxml xpath-Funktionen in den Standard-Namespace importieren?
  • Wie passe ich den Inhalt eines Elements in XPath (lxml) an?
  • Wie kann ich diesen XPath-Ausdruck in BeautifulSoup übersetzen?
  • Wie bekomme ich den Pfad eines Elements in lxml?
  • Einen bestimmten Attributwert mit XPath erhalten
  • Python: Verwenden von xpath lokal / auf einem bestimmten Element
  • Welche reine Python-Bibliothek soll ich verwenden, um eine Website zu kratzen?
  • Python lxml XPath Problem
  • Python-Skript, um alle Kommentare aus XML-Datei zu entfernen
  • Wertattribut für lxml.html
  • Python ist die beste Programmiersprache der Welt.