gpt4 book ai didi

python - 使用Pipeline.py删除Value而不是Field

转载 作者:行者123 更新时间:2023-12-03 07:59:47 25 4
gpt4 key购买 nike

我目前正在使用Scrapy脚本从亚马逊页面提取产品信息。我遇到的问题是异常处理,该异常处理仅丢弃错误的字段,而不丢弃输出中的整个项目/行。

当前蜘蛛:

from scrapy.spider import Spider
from scrapy.selector import Selector

from dirbot.items import Website


class DmozSpider(Spider):
name = "dmoz"
allowed_domains = ["amazon.co.uk"]
start_urls = [
"http://www.amazon.co.uk/dp/B004YVOU9S",
"http://www.amazon.co.uk/dp/B009NFE2QQ"
]

def parse(self, response):

sel = Selector(response)
sites = sel.xpath('//div[contains(@class, "a-container")]')
items = []

for site in sites:
item = Website()
item['asin'] = response.url.split('/')[-1]
item['title'] = site.xpath('div[@id="centerCol"]/div[@id="title_feature_div"]/div[@id="titleSection"]/h1[@id="title"]/span[@id="productTitle"]/text()').extract()
item['description'] = site.xpath('//*[@id="productDescription"]/div/div[1]/text()').extract()[0].strip()
item['price'] = site.xpath('//*[@id="priceblock_ourprice"]/text()').extract()
item['image'] = site.xpath('//*[@id="landingImage"]/@data-a-dynamic-image').extract()
item['brand'] = site.xpath('//*[@id="brand"]/text()').extract()
item['bullets'] = site.xpath('//*[@id="feature-bullets"]/span/ul').extract()[0].strip()
item['category'] = site.xpath('//*[@id="wayfinding-breadcrumbs_feature_div"]/ul').extract()[0].strip()
item['details'] = site.xpath('//*[@id="prodDetails"]/div/div[1]/div/div/div[2]/div/div/table').extract()[0].strip()
items.append(item)

return items

当抓取结果缺少任何字段时,我目前收到错误:
exceptions.IndexError: list index out of range

为了解决这个问题,我以IgnoreRequest的形式添加了一些异常处理。
from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.exceptions import IgnoreRequest

from dirbot.items import Website


class DmozSpider(Spider):
name = "dmoz"
allowed_domains = ["amazon.co.uk"]
start_urls = [
"http://www.amazon.co.uk/dp/B004YVOU9S",
"http://www.amazon.co.uk/dp/B009NFE2QQ"
]

def parse(self, response):

sel = Selector(response)
sites = sel.xpath('//div[contains(@class, "a-container")]')
items = []

try:
for site in sites:
item = Website()
item['asin'] = response.url.split('/')[-1]
item['title'] = site.xpath('div[@id="centerCol"]/div[@id="title_feature_div"]/div[@id="titleSection"]/h1[@id="title"]/span[@id="productTitle"]/text()').extract()
item['description'] = site.xpath('//*[@id="productDescription"]/div/div[1]/text()').extract()[0].strip()
item['price'] = site.xpath('//*[@id="priceblock_ourprice"]/text()').extract()
item['image'] = site.xpath('//*[@id="landingImage"]/@data-a-dynamic-image').extract()
item['brand'] = site.xpath('//*[@id="brand"]/text()').extract()
item['bullets'] = site.xpath('//*[@id="feature-bullets"]/span/ul').extract()[0].strip()
item['category'] = site.xpath('//*[@id="wayfinding-breadcrumbs_feature_div"]/ul').extract()[0].strip()
item['details'] = site.xpath('//*[@id="prodDetails"]/div/div[1]/div/div/div[2]/div/div/table').extract()[0].strip()
items.append(item)

return items

except IndexError:
raise IgnoreRequest("Data type not found.")

我想做的是以继续输出其余蜘蛛结果的方式处理此错误,只删除没有值的字段,而不是忽略整个项目。

任何帮助将不胜感激。

最佳答案

您可以采取不同的解决方案,如果您想使用try,catch和delete单个字段,则必须对所有字段都执行此操作,

    try:
//extract field
except IndexError:
raise IgnoreRequest("Data type not found.")

如果您想要一个空值而不是删除它,那么您必须检查值是否存在,您可以定义一个单独的提取方法
    def get_value_from_node(self, node):
value = node.extract()
return value[0] if value else ''

并为所有字段调用此方法
    item['title'] = self.get_value_from_node(site.xpath('div[@id="centerCol"]/div[@id="title_feature_div"]/div[@id="titleSection"]/h1[@id="title"]/span[@id="productTitle"]/text()'))

它将返回值或一个空字符串。并且不需要异常处理。

关于python - 使用Pipeline.py删除Value而不是Field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29342892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com