2016-07-28 132 views
0

我正在使用Scrapy來抓取包含特定文章的網頁。使用Scrapy的Xpath或Css選擇器返回空格Div

我想獲得存儲在div類與「返回」的信息。當我使用Scrapy Xpath或Css選擇器時,div返回總是空的大問題。

,我試圖提取的事業部:

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

我的蜘蛛代碼:

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("**************") 

我的終端登錄:

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

這個'div'在HTML源代碼中是空的。在我的Chrome瀏覽器中,它也是空的,直到您爲產品選擇一個選項。我使用http://www.alinea.fr/orca-canape-angle-gauche-droit-convertible-gris.html進行了測試。你之後的數據很可能是通過JavaScript加載的。 Scrapy本身只下載HTML,並不解釋JavaScript。您需要重現XHR調用或使用JavaScript渲染工具,如Selenium或Splash。 –

回答

0

您瀏覽的page根本沒有該內容div。所以你應該得到你所得到的。

如果更改爲其他頁面,例如http://www.alinea.fr/orca-canape-angle-droit-gris-fonce.html,您將看到div在那裏,而不是空的。從外殼

輸出: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>'] 

如果你想要的文字,你用//text()代替,如/text()只給你直接的文字div下,你的情況空白。

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