我要抓取这个网站: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)
基本上,我想复制所有的菜名,它们在哪里以及它们属于哪一餐。但是,我的代码仅适用于早餐,而其他餐点将与早餐完全相同,除非早餐中未出现任何位置。我认为以某种方式我不能用新菜覆盖旧菜。有人可以进行审查并在这个问题上帮助我吗?谢谢〜
答案 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个循环中完成循环的工作。