2014-02-09 52 views
0

我是新来的使用美丽和刮一般,所以我试图让我的脚湿说话。python beautifulsoup4解析谷歌财务数据

我想从这里得到的道琼斯工业平均指数信息的第一行: http://www.google.com/finance/historical?q=INDEXDJX%3A.DJI&ei=ZN_2UqD9NOTt6wHYrAE

虽然我可以读取数据,并打印(汤)输出的一切,我似乎无法到放下足够多。我将如何选择我保存到表格中的行?第一排怎么样?

非常感谢您的帮助!

import urllib.parse 
import urllib.request 
from bs4 import BeautifulSoup 
import json 
import sys 
import os 
import time 
import csv 
import errno 

DJIA_URL = "http://www.google.com/finance/historical?q=INDEXDJX%3A.DJI&ei=ZN_2UqD9NOTt6wHYrAE" 

def downloadData(queryString): 
    with urllib.request.urlopen(queryString) as url: 
     encoding = url.headers.get_content_charset() 
     result = url.read().decode(encoding) 
    return result 

raw_html = downloadData(DJIA_URL) 
soup = BeautifulSoup(raw_html) 

#print(soup) 

table = soup.findAll("table", {"class":"gf-table historical_price"}) 

回答

2

你要那么第二tr表行:

prices = soup.find('table', class_='historical_price') 
rows = prices.find_all('tr') 
print rows[1] 

,或者列出与价格信息的所有行,跳过一个与任何th元素:

for row in rows: 
    if row.th: continue 

或使用那第一个标题作为字典键的来源:

keys = [th.text.strip() for th in rows[0].find_all('th')] 
for row in rows[1:]: 
    data = {key: td.text.strip() for key, td in zip(keys, row.find_all('td'))} 
    print data 

主要生产:

{u'Volume': u'105,782,495', u'High': u'15,798.51', u'Low': u'15,625.53', u'Date': u'Feb 7, 2014', u'Close': u'15,794.08', u'Open': u'15,630.64'} 
{u'Volume': u'106,979,691', u'High': u'15,632.09', u'Low': u'15,443.00', u'Date': u'Feb 6, 2014', u'Close': u'15,628.53', u'Open': u'15,443.83'} 
{u'Volume': u'105,125,894', u'High': u'15,478.21', u'Low': u'15,340.69', u'Date': u'Feb 5, 2014', u'Close': u'15,440.23', u'Open': u'15,443.00'} 
{u'Volume': u'124,106,548', u'High': u'15,481.85', u'Low': u'15,356.62', u'Date': u'Feb 4, 2014', u'Close': u'15,445.24', u'Open': u'15,372.93'} 

+0

嗨,我应该使用.find和.find_all时? – user1357015

+0

'.find()'仅查找* first *匹配或返回'None','.find_all()'返回0个或更多匹配的列表。 –

+0

太好了。这真的有帮助。是row.th特定于beautifulsoup?以前从未见过。 – user1357015