2016-07-28 7 views
0

Ich benutze Scrapy zum Crawlen einer Webseite, die einen bestimmten Artikel enthält.Empty Div Return mit Xpath oder Css Selector mit Scrapy

Ich versuche, die Informationen im div mit der Klasse "return" gespeichert zu bekommen. Das große Problem, dass die Div-Rückgabe immer leer ist, wenn ich Scrapy Xpath oder Css-Selektoren verwende.

Das Div dass ich versuche, zu extrahieren:

<div class="return"> 

         <p><strong>Conditionnement : </strong></p> 
         <p class="one-product-detail">2 colis :<br> 
         L178xl106xH80&nbsp;72kg<br>L178xl112xH80&nbsp;60kg<br> 
         <span itemprop="weight" alt="3fin" class="hidden" hidden="">132kg</span></p> 

</div> 

Meine Spinne Code:

import scrapy 
from alinea.items import AlineaItem 

class AlineaSpider(scrapy.Spider): 
    name = "alinea" 
    start_urls = [ 
     "http://www.alinea.fr/", 
    ] 
    def parse(self, response): 
     # ref = input("Enter Item Reference ?\n") 
     #50 
     # link = "http://www.alinea.fr/alinea_fredhopper/catalogSearch_result/products/search/" + str(ref) 
     link = "http://www.alinea.fr/alinea_fredhopper/catalogSearch_result/products/search/" + str(50) 
     print(link) 
     return scrapy.Request(link, 
           callback=self.parse_page2) 

    def parse_page2(self, response): 
     self.logger.info("Visited %s", response.url) 

     for sel in response.xpath('//li[contains(@itemprop,"title")]/text()'): 
      print("**************") 
      print("Description") 
      print(sel.extract()) 
      print("**************") 

     # print("------------------------------------------------------------------") 
     # 
     # for sel in response.xpath('//*[@class="delivery"]'): 
     # 
     #  print("**************") 
     #  print("Details") 
     #  print(sel.extract()) 
     #  print("**************") 

     print("------------------------------------------------------------------") 

     for sel in response.css('[class="return"]'): 

      print("**************") 
      print("Details") 
      print(sel.extract()) 
      print("**************") 

Mein Terminal-Log:

2016-07-28 12:57:21 [alinea] INFO: Visited http://www.alinea.fr/orca-canape-angle-gauche-droit-convertible-gris.html 
************** 
Description 

        Orca - Canapé CONVERTIBLE d'angle gauche ou droit gris     
************** 
------------------------------------------------------------------ 
************** 
Details 
<div class="return"> 



</div> 
************** 
+2

Das 'div' ist in der HTML-Quelle leer. Es ist auch leer in meinem Chrome-Browser, bis Sie eine Option für das Produkt auswählen. Ich testete mit http://www.alinea.fr/orca-canape-angle-gauche-droit-convertible-gris.html. Die Daten, nach denen Sie suchen, werden höchstwahrscheinlich über JavaScript geladen. Scrapy selbst lädt nur HTML und nicht JavaScript. Sie müssen entweder den XHR-Aufruf reproduzieren oder ein JavaScript-Rendering-Tool wie Selenium oder Splash verwenden. –

Antwort

0

Die von Ihnen besuchte page hat überhaupt keinen Inhalt für diese div. Du solltest also bekommen, was du hast. Wenn Sie zu anderen Seiten wechseln, zum Beispiel http://www.alinea.fr/orca-canape-angle-droit-gris-fonce.html, sehen Sie, dass div dort ist und nicht leer ist.

Ausgabe der Shell: scrapy shell 'http://www.alinea.fr/orca-canape-angle-droit-gris-fonce.html'

In [1]: response.xpath('//div[@class="return"]').extract() 
Out[1]: [u'<div class="return">\n\n   \n<p><strong>Conditionnement : </strong></p>\n<p class="one-product-detail">\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t2 colis :<br>\n\t\t\t\t\t\t\t\t\t L178xl106xH80\xa055kg<br>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t L178xl112xH80\xa053kg<br>\t\t\t\t\t\t<span itemprop="weight" alt="3fin" hidden class="hidden">108kg</span></p>\n  \n</div>'] 

Wenn Sie den Text möchten, verwenden Sie //text() stattdessen als /text() gibt Ihnen nur direkt unter div Text, in Ihrem Fall Leerzeichen.

In [2]: response.xpath('//div[@class="return"]/text()').extract() 
Out[2]: [u'\n\n   \n', u'\n', u'\n  \n'] 

In [3]: [x.strip() for x in response.xpath('//div[@class="return"]//text()').extract()]                                        
Out[3]: 
[u'', 
u'Conditionnement :', 
u'', 
u'2 colis :', 
u'L178xl106xH80\xa055kg', 
u'L178xl112xH80\xa053kg', 
u'', 
u'108kg', 
u'']