Ожидаемый выход не происходит в Django python
Я новичок в python! Я пытался создать структуру меню любого сайта!
выход идет нормально, когда я пробовал в VScode!
здесь код
for i in menu_items('https://natureshair.com.au/'):
print(json.dumps(i, indent=6))
И вот результат, скрипт может отбраковать все меню
Теперь я пытаюсь собрать этот сайт и вывести результаты с помощью Django! Странно, но если я использую тот же сайт, то вывод будет пустым!
вот код :
def product(request):
finaldata=request.GET["title"]
finaldata1=request.GET["title1"]
finaldata2=request.GET["title2"]
results = list(
item
#for link in ('https://natureshair.com.au/', 'https://www.trafficradius.com.au/')
for link in (finaldata,finaldata1,finaldata2)
for item in menu_items(link))
return JsonResponse({'results': results})
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)])
Примечание: это не работает для нескольких сайтов, таких как 'https://natureshair.com.au/', и это работает нормально в коде VS!
Не уверен, где я ошибаюсь
Здесь ссылка на мой проект Мой проект