Как хранить более 1 информации (тегов) на столбец при извлечении данных? - PullRequest
0 голосов
/ 23 мая 2019

В настоящее время я тестирую своего первого паука с помощью scrapy, и все, кажется, работает нормально, за исключением случаев, когда я пытаюсь извлечь данные.

Я настроил конвейер так, чтобы элементы сохранялись и перенаправлялись вВ базе данных, которую можно прочитать с помощью sqlite3, для каждого элемента есть несколько тегов, но при экспорте данных сохраняется только первый тег.

У меня есть 3 столбца данных:

  • title (1 данные в строке)
  • author (по одной в строке)
  • tags (несколько данных в строке).

Проблема в том, что тег столбца показывает только первый захваченный тег

class QuotetutorialPipeline(object):

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

    def create_connection(self):
        self.conn = _sqlite3.connect("myquotes.db")
        self.curr = self.conn.cursor()

    def create_table(self):
        self.curr.execute("""DROP TABLE IF EXISTS quotes_tb""")
        self.curr.execute("""create table quotes_tb(
                        title text,
                        author text,
                        tag text
                        )""")

    def process_item(self, item, spider):
        self.store_db(item)
        print("Pipeline :" + item['title'][0])
        return item

    def store_db(self,item):
        self.curr.execute(""" insert into quotes_tb values (?,?,? )""", (
            item['title'][0],
            item['author'][0],
            item['tag']
        ))

Я ожидаю, что для item[tag] будет более одного элемента, но только первыйСохраненный.

1 Ответ

0 голосов
/ 24 мая 2019

Полагаю, элемент ['tag'] - это список.Вы должны решить, как вы хотите сохранить это.

# option 1: as json
import json
tags = json.dumps(item['tag'])  #  '["tag1", "tag2", ..]'

# option 2: as joined string
tags = '|'.join(item['tag']) # 'tag1|tag2'

# option 3: one row for each tag
for tag in item['tag']:
    self.curr.execute(""" insert into quotes_tb values (?,?,? )""", (
            item['title'][0],
            item['author'][0],
            tag
        ))
...