Как динамически печатать данные JSON в несколько столбцов CSVPython

Программы на Python
Гость
Как динамически печатать данные JSON в несколько столбцов CSV

Сообщение Гость »

Я новичок в Python, я пытаюсь очистить меню навигации веб-сайта и сохранить эти данные в файле CSV. Скрипт работает нормально, и я могу хранить данные в формате CSV. Единственная проблема, с которой я столкнулся, заключается в том, что я не могу хранить эти данные в нескольких столбцах. Данные сохраняются в первом столбце файла CSV.
Вот мой код:

Код: Выделить всё

import csv, json, sys
import bs4, requests

def to_dict(r):
if all(isinstance(i, dict) for i in r):
return {a:b for i in r for a, b in i.items()}
if all(isinstance(i, list) for i in r):
return [i for b in r for i in b]
return r

def get_menu(page_name):
if page_name.name == 'li':
#collect all li values, create a dictionary if li has a ul child
li_text = []
for i in page_name.contents:
if isinstance(i, bs4.element.NavigableString) or i.select_one('ul') is None:
if (t:=i.get_text(strip=True)): #default li text
li_text.append(t)
else: #li contains a ul, build a dict with li's text as key
if li_text:
li_text.append({li_text.pop():to_dict([*get_menu(i)])})

else:
yield to_dict([*get_menu(i)])
yield from li_text
return
all_text = []
for i in page_name.contents:
if getattr(i, 'name', None) == 'ul':
r = [*get_menu(i)] #get ul's li values
e, flag = i, False
while (e:=e.previous_sibling) is not None: #check if ul has descriptive text
if (isinstance(e, bs4.element.NavigableString) or e.select_one('ul') is None) and e.get_text(strip=True):
yield {e.get_text(strip=True):to_dict(r)} #yield back dictionary if text exists
flag = True
break
if not flag: yield to_dict(r)
elif not isinstance(i, bs4.element.NavigableString):
yield from get_menu(i) #recursively traverse element

def menu_items(link):
page = bs4.BeautifulSoup(requests.get(link).text, 'html.parser')
for nav in page.select('nav'): #find all `nav` elements from which to anchor search
yield to_dict([*get_menu(nav)])

for i in menu_items('https://www.turramusic.com.au/'):

f = csv.writer(open(r"C:\Users\Manikanta-WD\Desktop\run\csv\url_output.csv", "w"))
f.writerow(["level 1", "level 2", "level 3", "level 4", "level 5"])
for x in i:
f.writerow([x])
Вот изображение вывода:
[img]https://i.stack. imgur.com/eb6OU.png[/img]

Но я хочу напечатать разные уровни меню в разных столбцах листа. Возможно ли это?
Я попробовал такой код:

Код: Выделить всё

for x in x:
f.writerow([x["Keyboards & Synths"],
x["Drums & Percussion"],
x["fields"]["Band & Orchestral'"],
x["fields"]["Live Sound"],
x["fields"]["Amps & Effects"]])
Это не работает, и я знаю, что это не динамический способ распечатать. Есть ли способ сделать эту динамику такой, как первый уровень в одном столбце, второй уровень в следующем столбце и т. д.?

Подробнее здесь: https://stackoverflow.com/questions/781 ... mns-of-csv

Вернуться в «Python»