解析从BeautifulSoup返回的JavaScript

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)


Mar*_*ers 5

你需要的只是一个小字符串切片:

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的一个子集.