2016-07-28 93 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'']