我有一个简单的机器人,试图刮去健美补品的网站并提取补充信息。机器人从一个页面开始,您可以在该页面中选择类别,转到从第一个类别链接到的页面,然后转到该类别中的第一个产品。一切正常 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
<br>Serving Per Container: 60
<br>
<br>Amount Per Serving
<br>
<br>Androst-3,5-Diene-7,17-Dione - 50 mg
<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破坏。我做了什么导致这个或它是一个破碎的功能?我该怎么解决这个问题?感谢您抽出宝贵时间阅读本文。
答案 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')