Scrapy的Selector.extract()已损坏

时间:2017-05-14 02:19:28

标签: python command-line web-scraping scrapy

我有一个简单的机器人,试图刮去健美补品的网站并提取补充信息。机器人从一个页面开始,您可以在该页面中选择类别,转到从第一个类别链接到的页面,然后转到该类别中的第一个产品。一切正常 UNTIL 我到达包含实际产品信息的<div>元素。当我在div元素上调用extract时,它会吐出一个应该吐出来的乱码版本。这是我的蜘蛛代码:

# -*- coding: utf-8 -*-
import scrapy


class IllpumpyouupSpider(scrapy.Spider):
    name = "illpumpyouup"
    allowed_domains = ["illpumpyouup.com"]
    start_urls = ['http://illpumpyouup.com/categories/']

    def parse(self, response):
            print('Starting crawl!')
            hrefs = response.css('.woocommerce').xpath('ul/li/a/@href')

            #loop through hrefs here
            href = hrefs[1]
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse_category_page)

    def parse_category_page(self, response):

            hrefs = response.css('.product-inner').xpath('a/@href')

            #loop through hrefs here
            href = hrefs[0]
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse_supplement_page)

    def parse_supplement_page(self, response):
            print('Attempting to parse supplement page!')
            facts_div_list = response.css('.supplementfacts')

            print('facts_div_list.extract():\n-----\n{}\n'.format(facts_div_list.extract()))

            facts_div = facts_div_list[0]

            print('facts_div.extract():\n-----\n{}\n'.format(facts_div.extract()))

以下是facts_div中选择的元素的实际内容:

<div class="supplementfacts">

    <h3>Supplement Facts</h3>

    <p>
        Serving Size: 1-SEDDS Tablet 
        &nbsp;<br>Serving Per Container: 60
        &nbsp;<br>  
        &nbsp;<br>Amount Per Serving
        &nbsp;<br>
        &nbsp;<br>Androst-3,5-Diene-7,17-Dione - 50 mg
        &nbsp;<br>6,7 Dihydroxybergamotin - 100 mg
    </p>

</div>

我想在这里找到p元素中的文本。应该很容易吧?好吧,当我实际使用命令行命令scrapy crawl illpumpyouup -s LOG_ENABLED=False运行脚本时,这是我的确切输出,从我的终端复制并粘贴(我删除了一堆空格,以便您可以更轻松地阅读):

Starting crawl!
Attempting to parse supplement page!
facts_div_list.extract():
-----
['<div class="supplementfacts">\r\n\r\n\t <h3>Supplement Facts</h3>\r\n\r\n\t <p>Serving Size: 1-SEDDS Tablet \r\xa0<br>Serving Per Container: 60\r\xa0<br>\r\xa0<br>Amount Per Serving\r\xa0<br>\r\xa0<br>Androst-3,5-Diene-7,17-Dione - 50 mg\r\xa0<br>6,7 Dihydroxybergamotin - 100 mg</p>\r\n\r\n </div>']

facts_div.extract():
-----
<div class="supplementfacts">

                                                <h3>Supplement Facts</h3>

 <br>6,7 Dihydroxybergamotin - 100 mg</p>           <p>Serving Size: 1-SEDDS Tablet 

                                            </div>

正如你所看到的,当我在SelectorList而不是Selector本身上调用extract时,提取工作正常(我认为)。我在字符串列表中获得了正确的转换后的html。但是,当我在Selector上调用extract时,我得到了混乱的混乱HTML,甚至没有包含所有原始数据!我不知道是怎么回事。除非我弄错了,否则Selector.extract()函数会以某种方式被html破坏。我做了什么导致这个或它是一个破碎的功能?我该怎么解决这个问题?感谢您抽出宝贵时间阅读本文。

1 个答案:

答案 0 :(得分:1)

抓取的数据似乎没有任何问题。这是你认为它具有误导性的方式。

您可能已经注意到数据中有一些回车字符(\r)(例如,在print('facts_div_list.extract():...)输出中)。这是打印回车字符时的示例:

>>> print 'foo\rbar\rbaz'
baz
>>> print 'is \r my \r data \r missing?'
 missing?

要查看提取的数据,您可以尝试打印如下内容:

facts_div.extract().replace('\r', '\n')