Данные парсинга не сохраняются в xlsx
Решил изучать парсинг. Первый мой парсер. не могу понять, почему собранные данные не сохраняются в xlsx-файл Данные собираются, в json сохраняется, а в xlsx нет. Ошибок никаких не выдает. Помогите разобраться
Вот код:
import json
import requests
import xlsxwriter
from bs4 import BeautifulSoup
OUT_FILENAME = 'out.json'
OUT_XLSX_FILENAME = 'out.xlsx'
def dump_to_json(filename, data, **kwargs):
kwargs.setdefault('ensure_ascii', False)
kwargs.setdefault('indent', 1)
with open(OUT_FILENAME, 'w', encoding='utf-8') as f:
json.dump(data, f, **kwargs)
def dump_to_xlsx(filename, data):
if not len(data):
return None
with xlsxwriter.Workbook(filename) as workbook:
ws = workbook.add_worksheet()
headers = ['Название', 'Назв.(англ.)', 'Год выпуска', 'Страна', 'Рейтинг', 'Ссылка']
bold = workbook.add_format({'bold': True})
for col, h in enumerate(headers):
ws.write_string(0, col, h, cell_format = bold)
for item in enumerate(data, start=1):
ws.write_string(row, 0, item['title_rus'])
ws.write_string(row, 1, item['title_eng'])
ws.write_string(row, 2, item['release'])
ws.write_string(row, 3, item['count'])
ws.write_string(row, 4, item['raiting'])
ws.write_string(row, 5, item['url'])
url = "https://www.kinopoisk.ru/popular/films/?page=1&tab=all"
def get_html(url):
r = requests.get(url)
return r.text
def get_total_pages(html):
soup = BeautifulSoup(html, 'lxml')
pages = soup.find('div', class_='paginator _2oq0_M2giZyz6Yew9Gveww').find_all('a', class_='paginator__page-number')[-1].get('href')
total_pages = pages.split('=')[1].split('&')[0]
return int(total_pages)
data = []
def get_page_data(html):
#data = []
soup = BeautifulSoup(html, 'lxml')
ads = soup.find('div', class_= 'selection-list').find_all('div', class_ = 'desktop-rating-selection-film-item')
for ad in ads:
#title, count, url, img, raiting
try:
title_rus = ad.find('div', class_= 'desktop-rating-selection-film-item__content-wrapper').find('p', class_='selection-film-item-meta__name').text.strip()
except:
title_rus = ''
try:
title_eng = ad.find('div', class_= 'desktop-rating-selection-film-item__content-wrapper').find('p', class_='selection-film-item-meta__original-name').text.strip().split(',')[0]
except:
title_eng = ''
try:
release = ad.find('div', class_= 'desktop-rating-selection-film-item__content-wrapper').find('p', class_='selection-film-item-meta__original-name').text.strip().split(',')[1]
except:
release = ''
try:
count = ad.find('span', class_='selection-film-item-meta__meta-additional-item').text
except:
count = ''
try:
raiting = ad.find('span', class_='rating__value rating__value_neutral').text
except:
raiting = ''
try:
url = 'https://www.kinopoisk.ru' + ad.find('a', class_='selection-film-item-meta__link').get('href')
except:
url = ''
item = {'title_rus': title_rus,
'title_eng': title_eng,
'release': release,
'count': count,
'raiting': raiting,
'url': url}
print('\a {}'.format(url))
data.append(item)
return item
def main():
url = 'https://www.kinopoisk.ru/popular/films/?page=1&tab=all'
base_url = 'https://www.kinopoisk.ru/popular/films/?'
page_part = 'page='
query_part = '&tab=all'
total_pages = get_total_pages(get_html(url))
for i in range(1, 3): #total_pages+1):
url_gen = f"{base_url}{page_part}{str(i)}{query_part}"
html = get_html(url_gen)
get_page_data(html)
dump_to_json(OUT_FILENAME, data)
dump_to_json(OUT_XLSX_FILENAME, data)
if __name__ == '__main__':
main()
Ответы (1 шт):
Автор решения: Proksima
→ Ссылка
Вы в main два раза подряд вызываете dump_to_json, когда надо dump_to_xlsx.