Вот мой код:
Код: Выделить всё
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