2017-09-28 6 views
1

Ich versuche, Daten aus einer Tabelle mit den folgenden HTML zu kratzen:Correct XPath für Tabellendaten Scrapy

enter image description here

Leider für das Laden als ein Bild, wenn ich versuche, den Code einzufügen, nicht wahr korrekt angezeigt, aber ich bin nur an dem Text interessiert, der den hervorgehobenen Klassen zugeordnet ist.

Ich habe versucht, den Baum unter Verwendung zum Beispiel response.xpath('//table/tbody/td').extract() abzuarbeiten, die nichts zurückgibt. Ich habe auch versucht, auf die Klassen wie zum Beispiel response.xpath('//div/div/div/div/div/div/table/tbody/tr/td[class="pricePweek"]').extract() zugreifen, aber wieder gibt dies nichts zurück. Sind es die Zeilenumbrüche, die das Problem hier auslösen?

Ich hatte nicht diese Probleme bei der Verwendung von Scrapy vor, aber habe nicht versucht, von einer Tabellenstruktur wie folgt zu kratzen.

+0

Anstelle von Bildern versuchen Sie, hier einen Link mit den Tabellenelementen zu löschen, so dass Sie eine schnelle Antwort haben können. – SIM

Antwort

1

Ihr Problem ist, dass Ihr Browser verwenden, um Ihre Xpath zu validieren und dann mit ihnen auf Scrapy. Was dir vielleicht kein wirkliches Bild gibt. Betrachten Sie die folgende HTML-Seite

<html> 
<body> 
<table> 
<tr> 
    <td class="name">Tarun</td> 
</tr> 
</table> 
</body> 
</html> 

Wenn Sie den HTML-Code in einer Datei und öffnen in Browser

tbody added

Können Sie vom Browser hinzugefügt sehen tbody retten? Dies ist nicht in unserem Quellcode enthalten. Welcher Schrott würde sehen. Dein Xpath sollte also tbody nicht enthalten. Wenn Sie unten verwenden, sollte es funktionieren

price = response.xpath('//td[class="pricePweek"]').extract() 
+0

Ahh ja, ich sollte den Baum anhand des html in der Shell dann folgen! Vielen Dank – Maverick

+0

Hallo @Tarun Lalwani ein wenig Probleme mit einer anderen Website, würde es Ihnen etwas ausmachen, wenn ich einen Chat mit Ihnen begann, um Ihre Meinung darüber zu bekommen? Willst du nicht unnötig eine andere Frage starten. – Maverick

+0

Sicher, Sie müssen nicht die Antwort für das gleiche obwohl akzeptieren :-) –

2

Ich bin mir nicht sicher, welche Art von Ausgabe Sie bevorzugen. Unter der Annahme, dass Ihre erwartete Ausgabe ist ein Element pro Zeile der Datentabelle, und hier ist ein Beispielcode (Sie müssen möglicherweise die ipython Konsole promptions entfernen):

In [10]: for tr in response.xpath('//table/tbody/tr'): 
    ...:  item = dict() 
    ...:  item['title'] = tr.xpath('./td[@class="title"]/text()').extract_first().strip() 
    ...:  item['description'] = ','.join(x.strip() for x in tr.xpath('./td[@class="description"]//text()').extract()) 
    ...:  item['pricePweek'] = tr.xpath('./td[@class="pricePweek"]//text()').extract_first().strip() 
    ...:  item['weeks'] = tr.xpath('./td[@class="weeks"]/text()').extract_first().strip() 
    ...:  item['bookFees'] = tr.xpath('./td[@class="bookFees"]/text()').extract_first().strip() 
    ...:  item['total'] = tr.xpath('./td[@class="total"]/text()').extract_first().strip() 
    ...:  item['sDate'] = tr.xpath('./td[@class="sDate"]/text()').extract_first().strip() 
    ...:  item['bookLink'] = tr.xpath('./td[@class="bookLink"]/a/@href').extract_first().strip() 
    ...:  print(item) 

Und hier ist der Druck:

{'title': 'En-Suite (Ground Floor)', 'description': '10.5sqm,3/4 bed,En-suite Bathroom (WC, Basin and Bath),Use of ground floor communal kitchen', 'pricePweek': '£163.00', 'weeks': '50', 'bookFees': '£250.00', 'total': '£8,150.00', 'sDate': '23 Sep 2017', 'bookLink': 'https://www.crm-students.com/crm-accommodation/application-form/?tx_wistcas_booknow%5BroomType%5D=2917&tx_wistcas_booknow%5Bwait%5D=1&tx_wistcas_booknow%5BbookingPeriod%5D=5386&tx_wistcas_booknow%5Baction%5D=book0&tx_wistcas_booknow%5Bcontroller%5D=RoomType&cHash=3dd0f1b377330cfbad6327b728678cbd'} 
{'title': 'En-Suite (Ground Floor)', 'description': '10.5sqm,3/4 bed,En-suite Bathroom (WC, Basin and Bath),Use of ground floor communal kitchen', 'pricePweek': '£163.00', 'weeks': '49', 'bookFees': '£250.00', 'total': '£7,987.00', 'sDate': '30 Sep 2017', 'bookLink': 'https://www.crm-students.com/crm-accommodation/application-form/?tx_wistcas_booknow%5BroomType%5D=2917&tx_wistcas_booknow%5Bwait%5D=1&tx_wistcas_booknow%5BbookingPeriod%5D=6075&tx_wistcas_booknow%5Baction%5D=book0&tx_wistcas_booknow%5Bcontroller%5D=RoomType&cHash=db85ff90cacb487ee98942d955141b09'} 
{'title': 'Large Studio (Courtyard)', 'description': '22-23m,2,3/4 bed,Generous studio with same features as "Standard" but slightly larger,Dual Occupancy is available for an additional 20% of the advertised rate per week', 'pricePweek': '£223.00', 'weeks': '51', 'bookFees': '£250.00', 'total': '£11,373.00', 'sDate': '16 Sep 2017', 'bookLink': 'https://www.crm-students.com/crm-accommodation/application-form/?tx_wistcas_booknow%5BroomType%5D=718&tx_wistcas_booknow%5Bwait%5D=1&tx_wistcas_booknow%5BbookingPeriod%5D=5652&tx_wistcas_booknow%5Baction%5D=book0&tx_wistcas_booknow%5Bcontroller%5D=RoomType&cHash=e959ccd71b62be9211eb1dd3ad5b362c'} 
{'title': 'Large Studio (Courtyard)', 'description': '22-23m,2,3/4 bed,Generous studio with same features as "Standard" but slightly larger,Dual Occupancy is available for an additional 20% of the advertised rate per week', 'pricePweek': '£223.00', 'weeks': '49', 'bookFees': '£250.00', 'total': '£10,927.00', 'sDate': '30 Sep 2017', 'bookLink': 'https://www.crm-students.com/crm-accommodation/application-form/?tx_wistcas_booknow%5BroomType%5D=718&tx_wistcas_booknow%5Bwait%5D=1&tx_wistcas_booknow%5BbookingPeriod%5D=6075&tx_wistcas_booknow%5Baction%5D=book0&tx_wistcas_booknow%5Bcontroller%5D=RoomType&cHash=5f798c129cfe56dead110ed5d80efa75'} 

Beachten Sie, dass einige Zellen andere Elemente enthalten, die Sie ordnungsgemäß behandeln müssen. Zum Beispiel enthält die Beschreibungszelle eine ungeordnete Liste, hier verkette ich sie durch die Trennung ,.

Ich hoffe, das wäre hilfreich.

Dank

+0

Vielen Dank dafür! – Maverick