Wad*_*ade 16 javascript python beautifulsoup html-parsing
我想解析网页http://dcsd.nutrislice.com/menu/meadow-view/lunch/来抓住今天的午餐菜单.(我已经建立了一个Adafruit #IoT热敏打印机,我想每天自动打印菜单.)
我最初使用BeautifulSoup来解决这个问题,但事实证明大部分数据都是用JavaScript加载的,我不确定BeautifulSoup可以处理它.如果您查看来源,您将看到存储的相关数据bootstrapData['menuMonthWeeks'].
import urllib2
from BeautifulSoup import BeautifulSoup
url = "http://dcsd.nutrislice.com/menu/meadow-view/lunch/"
soup = BeautifulSoup(urllib2.urlopen(url).read())
Run Code Online (Sandbox Code Playgroud)
这是获取源和审查的简便方法.
我的问题是:提取这些数据的最简单方法是什么,以便我可以用它做点什么?从字面上看,我想要的只是一个字符串:
西南芝士煎蛋卷,马铃薯楔,收获吧(THB),THB - 芝士香蒜酱面包,火腿熟食三明治,红辣椒棒,草莓
我已经考虑过使用webkit处理页面并获取HTML(即浏览器的功能),但这似乎不必要地复杂.我宁愿简单地找到可以解析bootstrapData['menuMonthWeeks']数据的东西.
use*_*559 10
像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
Run Code Online (Sandbox Code Playgroud)
之后,您将需要在菜单中搜索您感兴趣的日期.
编辑:我的一些矫枉过正:
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.'
Run Code Online (Sandbox Code Playgroud)
你需要的只是一个小字符串切片:
import json
soup = BeautifulSoup(urllib2.urlopen(url).read())
script = soup.findAll('script')[1].string
data = script.split("bootstrapData['menuMonthWeeks'] = ", 1)[-1].rsplit(';', 1)[0]
data = json.loads(data)
Run Code Online (Sandbox Code Playgroud)
毕竟,JSON是JavaScript的一个子集.
| 归档时间: |
|
| 查看次数: |
37429 次 |
| 最近记录: |