@H_404_1@我想解析网页
http://dcsd.nutrislice.com/menu/meadow-view/lunch/来抓住今天的午餐菜单. (我已经建立了一个Adafruit #IoT热敏打印机,我想每天自动打印菜单.)
我最初使用BeautifulSoup接近这个,但事实证明,大部分数据都是加载在JavaScript中,我不知道BeautifulSoup可以处理它.如果您查看来源,您将看到存储在bootstrapData [‘menuMonthWeeks’]中的相关数据.@H_502_3@
import urllib2 from BeautifulSoup import BeautifulSoup url = "http://dcsd.nutrislice.com/menu/meadow-view/lunch/" soup = BeautifulSoup(urllib2.urlopen(url).read())
我的问题是:最简单的方法是提取这些数据,以便我可以做些什么?从字面上来说,我想要的是一个字符串,如:@H_502_3@
Southwest Cheese Omelet,Potato Wedges,The Harvest Bar (THB),THB – Cheesy Pesto Bread,Ham Deli Sandwich,Red Pepper Sticks,Strawberries@H_502_3@
我曾考虑过使用webkit处理页面并获取HTML(即浏览器的功能),但这似乎不必要的复杂.我宁愿找到一些可以解析bootstrapData [‘menuMonthWeeks’]数据的东西.@H_502_3@
解决方法
像PhantomJS这样的东西可能更强大,但是这里有一些基本的Python代码来提取完整的菜单:
import json import re import urllib2 text = urllib2.urlopen('http://dcsd.nutrislice.com/menu/meadow-view/lunch/').read() menu = json.loads(re.search(r"bootstrapData\['menuMonthWeeks'\]\s*=\s*(.*);",text).group(1)) print menu
编辑:我的一些过度伤害@H_502_3@
import itertools import json import re import urllib2 text = urllib2.urlopen('http://dcsd.nutrislice.com/menu/meadow-view/lunch/').read() menus = json.loads(re.search(r"bootstrapData\['menuMonthWeeks'\]\s*=\s*(.*);",text).group(1)) days = itertools.chain.from_iterable(menu['days'] for menu in menus) day = next(itertools.dropwhile(lambda day: day['date'] != '2014-01-13',days),None) if day: print '\n'.join(item['food']['description'] for item in day['menu_items']) else: print 'Day not found.'