使用Beautifulsoup从右侧滚动条获取新闻数据

时间:2014-08-12 10:58:04

标签: python beautifulsoup urllib2

我正在使用以下网页https://www.google.com/finance?q=NYSE%3AF&ei=LvflU_itN8zbkgW0i4GABQ 从右侧滚动条获取数据。

我已经附加了屏幕截图,其中有一个标记该段的红色箭头。

enter image description here

我使用了以下代码:

def parse():
    mainPage = urllib2.urlopen("https://www.google.com/finance?q=NYSE%3AF&ei=LvflU_itN8zbkgW0i4GABQ")
    lSoupPage = BeautifulSoup(mainPage)

    for index in lSoupPage.findAll("div", {"class" : "jfk-scrollbar"}):
        for item in index.findAll("div", {"class" : "news-item"}):
            print item.a.text.strip()

我无法通过这样做来获取新闻网址。请帮忙。

1 个答案:

答案 0 :(得分:0)

侧边栏是通过AJAX加载的,不是页面本身的一部分。

该网页包含内容ID:

cid = lSoupPage.find('link', rel='canonical')['href'].rpartition('=')[-1]

用它来获取新闻数据:

newsdata = urllib2.urlopen('https://www.google.com/finance/kd?output=json&keydevs=1&recnews=0&cid=' + cid)

不幸的是,返回的数据无效JSON;密钥不使用引号。它是有效的ECMAScript,只是无效的JSON。

您可以使用正则表达式“修复”此问题,也可以使用接受ECMAscript对象表示法的宽松解析器。

后者可以使用外部demjson library

完成
>>> import demjson
>>> r = requests.get(
>>> data = demjson.decode(r.content)
>>> data.keys()
[u'clusters', u'result_total_articles', u'results_per_page', u'result_end_num', u'result_start_num']
>>> data['clusters'][0]['a'][0]['t']
u'Former Ford Motor Co. CEO joins Google board'

使用正则表达式进行修复:

import re
import json

repaired_data = re.sub(r'(?<={|,)\s*(\w+)(?=:)', r'"\1"', broken_data)
data = json.loads(repaired_data)