首页 > 解决方案 > 使用项目管道抓取到 SQLite - 由于列表中的 None 值而丢弃了整个记录

问题描述

我正在尝试使用 Scrapy 的项目管道从我的蜘蛛中插入四个项目,一切都很顺利,除了其中包含空值的 doc_id 项目(来自原始源并使用正则表达式清理)。

我的问题是,一旦它找到一个空值,整行就会被丢弃,而当我将数据导出为 CSV 文件时,如果有一个包含 None 值的列是完全可以的。

这是我得到的关键错误:

Traceback (most recent call last):
  File "/Users/opt/anaconda3/lib/python3.7/site-packages/twisted/internet/defer.py", line 654, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/Users/opt/anaconda3/lib/python3.7/site-packages/scrapy/utils/defer.py", line 154, in f
    return deferred_from_coro(coro_f(*coro_args, **coro_kwargs))
  File "/Users/user/document_scraper/doc/pipelines.py", line 32, in process_item
    self.store_db(item)
  File "/Users/user/document_scraper/doc/pipelines.py", line 40, in store_db
    item['doc_id'][0],
  File "/Users/opt/anaconda3/lib/python3.7/site-packages/scrapy/item.py", line 83, in __getitem__
    return self._values[key]
KeyError: 'doc_id'

我的物品.py:

import scrapy
from scrapy.loader import ItemLoader
from itemloaders.processors import TakeFirst, MapCompose, Compose
import re


class DocItem(scrapy.Item):
    date = scrapy.Field()
    office = scrapy.Field(output_processor = TakeFirst())
    doc_body = scrapy.Field()
    doc_id = scrapy.Field(input_processor = MapCompose(lambda item: re.findall('C\.\s\d{4}', item)[0].split('C. ')[1]))

我的管道.py:

import sqlite3


class DocPipeline(object):

    def __init__(self):
        self.create_connection()
        self.create_table()

    def create_connection(self):
        self.conn = sqlite3.connect("//document.db")
        self.curr = self.conn.cursor()

    def create_table(self):
        self.curr.execute("""DROP TABLE IF EXISTS DOC""")
        self.curr.execute("""CREATE TABLE DOC(
            DOC_DATE date,
            OFFICE text,
            BODY text,
            DOC_ID number
        )""")

    def process_item(self, item, spider):
        self.store_db(item)
        return item

    def store_db(self, item):
        self.curr.execute("""INSERT INTO DOC VALUES (?,?,?,?)""",(
            item['date'][0],
            item['office'],
            item['doc_body'][0],
            item['doc_id'][0],
        ))
        self.conn.commit()

无论其中一列中的 None 值如何,我如何告诉 SQLite 或 Scrapy 我希望返回我的项目?

标签: pythonsqlitescrapynull

解决方案


推荐阅读