无法摆脱循环中的旧值

时间:2018-10-11 02:10:08

标签: python loops web-scraping review

我要抓取这个网站:http://housing.ucdavis.edu/dining/menus/dining-commons/tercero/。以下是我的代码:

import requests #For request to the website
from bs4 import BeautifulSoup  #For parsering
from warnings import warn #For non-200 status code

url = 'http://housing.ucdavis.edu/dining/menus/dining-commons/tercero/' 
page = requests.get (url)
if page.status_code != 200:
    warn('Search: {}; Status code: {}. Status of the request is not normal.'.format (search, page.status_code))
else: 
    soup = BeautifulSoup(page.content, 'html.parser')

    main_content = soup.find('div', attrs = {'id': 'tab4content'})
    meal_tag = main_content.find_all('h4')

meal_list = []
for meal in meal_tag: 
    meal_name = meal.text
    meal_list.append(meal_name)
print ('The meals we have today are: '+", ".join(meal_list))
print (meal_list)


for meal_pick in meal_list: 
    print (meal_pick)
    locations_per_meal = main_content.find('h4',text=str(meal_pick)).find_next_siblings('h5')

    for location in locations_per_meal: 
        print (location.text)
        dish_list = main_content.find ('h5',text=location.text).find_next_sibling('ul')

        real_dish_list = []
        for dish in dish_list: 
            real_dish_list = dish_list.findChildren('span')

            real_item_list = []
            for item in real_dish_list:
                item = item.text
                real_item_list.append(item)
        print (real_item_list)

基本上,我想复制所有的菜名,它们在哪里以及它们属于哪一餐。但是,我的代码仅适用于早餐,而其他餐点将与早餐完全相同,除非早餐中未出现任何位置。我认为以某种方式我不能用新菜覆盖旧菜。有人可以进行审查并在这个问题上帮助我吗?谢谢〜

1 个答案:

答案 0 :(得分:0)

您遇到逻辑错误,并且难以调试,因为您正尝试直接将未格式化的HTML打印到控制台。 为了使自己更轻松,应该使用dict.update()dict.setdefault()尽早使用结构化数据填充字典。

在交互式Python控制台或正在运行的程序中,您还可以从其范围之外的循环(即

)中访问最新的项目。
menu = {}
for meal in meal_tag:
   # some loops later...
   menu.update({meal.text: {}})
# ...
import json
print(json.dumps(menu, indent=4))
print(meal.find_next_siblings('h5')[0].find_next_sibling('ul').find_all('li', recursive=False)[0].span.text)

我鼓励您尽可能多地尝试口译员。

回到主题上,您的逻辑错误可能与print(real_item_list)的作用域与我期望的范围不同有关,但是我发现调试代码很烦人,以至于看起来太深了。

再次,强调使调试尽可能容易的重要性。

实际上,重写它会更容易。您应该能够在大约7行和3个循环中完成循环的工作。