@Kirill_Kirillov
Начинающий web-developer

Почему парсер записывает данные одного цикла в разные строки бд?

Парсер собирает данные с сайта, и все бы ок, только он записывает теги <p> с каждой новой строки бд(sqlite3), причем другие столбцы просто дублируются, меняется только id, с чем это может быть связано?
def get_page_date(html):
    soup = BeautifulSoup(html, 'lxml')
    news = soup.find('div', class_='article-list').find_all('h3', class_='article-list__item-title')
    for new in news:
        try:
            title = new.find('a',class_= 'link_nodecor').text.strip()
            print(title)
        except:
            title = ''
        try:
            url = 'https://example.ru' + new.find('a',class_= 'link_nodecor').get('href')
            print(url)
            post = requests.get(url).text
            soup = BeautifulSoup(post,'lxml')
            articles = soup.find('div',class_='article').find_all('p')
            for article in articles:
                try:
                    post_text = article.text
                    cursor.execute("INSERT INTO news VALUES (?, ?, ?)", (title, post_text, url))
                    cursor.commit()
                    print(post_text)
                except:
                    post_text = ''
        except:
            url = ''


Как это можно исправить?
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ответы на вопрос 1
LaRN
@LaRN
Senior Developer
Если смотреть выравнивание кода, то запись в БД не выполняется в цикле, я про вот эти две команды:
cursor.execute("INSERT INTO news VALUES (?, ?, ?)", (title, post_text, url))
cursor.commit()

При таком раскладе в БД попадают только последние значения переменных title, post_text, url, которые были на момент выхода из цикла.
Нужно сместить команду:
cursor.execute("INSERT INTO news VALUES (?, ?, ?)", (title, post_text, url))
на 4 позиции вправо, а
cursor.commit()
оставить как есть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы