我在python中使用scrapy和try yield命令时遇到了一个问题。
如果我运行下面的脚本只在'名称'它返回的名称在该页上的完整列表预期,然而,当我在价格添加到脚本,然后为脱销项目没有价格,所以它返回'没有价格'预期,但也从输出中删除名称。我真的不明白为什么它这样做,我在下面添加了2个执行的屏幕截图(一个只运行名称,另一个运行名称和价格代码)
import scrapy
class TescoSpider(scrapy.Spider):
name = 'tesco'
start_urls = ['https://www.tesco.com/groceries/en-GB/shop/health-and-beauty/deodorants/all']
def parse(self, response):
for products in response.css('li.product-list--list-item'):
try:
yield {
'name': products.css('span.styled__Text-sc-1xbujuz-1.ldbwMG.beans-link__text::text').get(),
'price': products.css('p.styled__StyledHeading-sc-119w3hf-2.jWPEtj.styled__Text-sc-8qlq5b-1.lnaeiZ.beans-price__text::text').get().replace('£',''),
}
except:
yield {
'name': 'no name',
'price': 'no price',
}
1条答案
按热度按时间h6my8fg21#
这是因为当一个项目的价格不存在时,与您用来捕获价格的css选择器相匹配的元素也不存在:
products.css('p.styled__StyledHeading-sc-119w3hf-2.jWPEtj.styled__Text-sc-8qlq5b-1.lnaeiZ.beans-price__text::text')
这会导致选择器失败,并且当选择器失败时,它总是返回
None
。因此,当您调用
products.css('p.styled__StyledHeading-sc-119w3hf-2.jWPEtj.styled__Text-sc-8qlq5b-1.lnaeiZ.beans-price__text::text').get()
时,返回值为None
。然后立即调用
.replace('£','')
,这样它会引发异常,因为None
不是字符串,因此没有replace
方法。要在不使用
try & except
块的情况下解决此问题,您只需要在不同的步骤中评估价格。例如: