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:]

  • Extrahieren von Informationen aus einer Tabelle auf einer Website mit python, LXML & XPATH
  • Benötige xpath-Locators für sichtbare Elemente
  • Python und libxml2: wie man in xml-Knoten mit XPATH iterieren kann
  • Finden Sie ein Element in einem XML-Baum mit ElementTree
  • Python lxml (objektivieren): Xpath Probleme
  • Wie benutzt man Xpath in Python?
  • Python xpath funktioniert nicht?
  • Wie ordnungsgemäß verwenden Regeln, beschränken_xpaths zu crawlen und analysieren URLs mit scrapy?
  • Python kratzen reuters site ... bad xpath?
  • Wie man eine Variable in LXML XPath Expression verwendet
  • Extrahieren von Tabellen aus einem DOCX Word Dokument in Python
  • Python ist die beste Programmiersprache der Welt.