2016-07-31 29 views
2

Ich schreibe gerade einen kleinen Test webscraper mit den Python-Anfragen und Lxml-Bibliotheken. Ich versuche, den Text aus den Zeilen einer Tabelle aus this site mithilfe von Xpaths zu extrahieren, um die Tabelle eindeutig zu identifizieren. Da die Tabelle selbst nur anhand ihres Klassennamens identifiziert werden kann und der Klassenname nicht eindeutig ist, musste ich das Eltern-Element div verwenden, um die Tabelle anzugeben. Die Tabelle in Frage, dass die Termine der Saison bestellen, filmen, und airdates für die Show Game of Thrones auflistet, die ich mit dem folgenden Pfad wählen bin versucht:Wie man Text von einem HTML-Tabellenelement analysiert

tree.xpath('//div[@id = "mw-content-text"]//table[@class = "wikitable"]//text()') 

Aus irgendeinem Grund, wenn ich Wenn Sie diesen Pfad in der Shell ausgeben, wird eine leere Liste zurückgegeben. Ich glaube, dass das Drucken dieses Pfads einfach den gesamten Text in der Tabelle anzeigen würde, den ich versuchte, um sicherzustellen, dass ich den Inhalt tatsächlich abrufen konnte. Allerdings müsste ich tatsächlich jede Zeile der Tabelle drucken.

Gibt es etwas falsch mit diesem XPath? Wenn ja, wie wird der Tabelleninhalt gedruckt?

Antwort

2

Die wikitable ist zu einer Klasse zu breit, um Tabellen auf einer Wiki-Seite untereinander zu unterscheiden.

Ich würde stattdessen verlassen sich auf die vorhergehenden Adaptation schedule Label:

import requests 
from lxml.html import fromstring 

url = "https://en.wikipedia.org/wiki/Game_of_Thrones" 
response = requests.get(url) 
root = fromstring(response.content) 

table = root.xpath(".//h3[span = 'Adaptation schedule']/following-sibling::table")[0] 
for row in table.xpath(".//tr")[1:]: 
    print([cell.text_content() for cell in row.xpath(".//td")]) 

Drucke:

['Season 1', 'March 2, 2010[52]', 'Second half of 2010', 'April 17, 2011', 'June 19, 2011', 'A Game of Thrones'] 
['Season 2', 'April 19, 2011[53]', 'Second half of 2011', 'April 1, 2012', 'June 3, 2012', 'A Clash of Kings and some early chapters from A Storm of Swords[54]'] 
['Season 3', 'April 10, 2012[55]', 'Second half of 2012', 'March 31, 2013', 'June 9, 2013', 'About the first two-thirds of A Storm of Swords[56][57]'] 
['Season 4', 'April 2, 2013[58]', 'Second half of 2013', 'April 6, 2014', 'June 15, 2014', 'The remaining one-third of A Storm of Swords and some elements from A Feast for Crows and A Dance with Dragons[59]'] 
['Season 5', 'April 8, 2014[60]', 'Second half of 2014', 'April 12, 2015', 'June 14, 2015', 'A Feast for Crows, A Dance with Dragons and original content,[61] with some late chapters from A Storm of Swords[62] and elements from The Winds of Winter[63][64]'] 
['Season 6', 'April 8, 2014[60]', 'Second half of 2015', 'April 24, 2016', 'June 26, 2016', 'Original content and outlined from The Winds of Winter,[65][66] with some late elements from A Feast for Crows and A Dance with Dragons[67]'] 
['Season 7', 'April 21, 2016[50]', 'Second half of 2016[49]', 'Mid-2017[5]', 'Mid-2017[5]', 'Original content and outlined from The Winds of Winter and A Dream of Spring[66]']