从网站中提取表格

时间:2016-07-22 10:44:01

标签: python pandas beautifulsoup

我试图将Morningstar的桌子变成熊猫

网站链接 - http://financials.morningstar.com/cash-flow/cf.html?t=3IINFOTECH&region=ind&culture=en-US

由于网站是Javascript,我首先使用selenium在本地浏览器中呈现网站,然后从浏览器中读取呈现的HTML文件并尝试阅读表格。

问题是表存储在div样式中如下所示:这意味着我无法使用pandas读取HTML或美丽的汤读取表函数来读取表。两者都给出错误no tables found。有人可以通过简单的方法从div节点中提取数据,因为我不熟悉Python。下面是表

的HTML脚本的一部分
"" style="overflow:hidden;white-space: nowrap;">
         25,875
        </div>
        <div class="pos column6Width109px" id="Y_2" rawvalue="16810200000" style="overflow:hidden;white-space: nowrap;">
         16,810
        </div>
        <div class="pos column6Width109px" id="Y_3" rawvalue="13113600000" style="overflow:hidden;white-space: nowrap;">
         13,114"

1 个答案:

答案 0 :(得分:0)

您可以使用 requests Beautifulsoup 获取数据,使用ajax调用检索html:

from bs4 import BeautifulSoup
from json import loads

import requests
from time import time

params = {'columnYear': '5',  'region': 'ind', 'rounding': '3', 'period': '12',
          'curYearPart': '1st5year', 'culture': 'en-US',  'reportType': 'cf', 't': 'XNSE:3IINFOTECH',
          'callback': 'jsonp{}'.format(str(int(time()))), 'order': 'asc', '_': str(int(time()))}
r = requests.get('http://financials.morningstar.com/ajax/ReportProcess4HtmlAjax.html', params=params)

cont = r.content

jsn = loads(cont[cont.find("{"):cont.rfind("}") + 1])
soup = BeautifulSoup(jsn["result"])

table = soup.select_one("div.r_xcmenu.rf_table")
headers = [d.text for d in table.select("div.rf_header [id^=Y_]")]
print headers
for row in table.find_all("div","rf_crow", style=False):
    print([d.text for d in row.select("[id^=Y_]")])

这给了你:

[u'2011-03', u'2012-03', u'2013-03', u'2014-03', u'2015-03', u'TTM']
[u'3,511', u'(1,545)', u'495', u'498', u'(513)', u'(513)']
[u'975', u'1,092', u'2,308', u'2,564', u'2,291', u'2,291']
[u'\u2014', u'(80)', u'\u2014', u'\u2014', u'\u2014', u'\u2014']
[u'(10)', u'6', u'5', u'2', u'(1)', u'(1)']
[u'(1,277)', u'(3,556)', u'(401)', u'(409)', u'(2,080)', u'(2,080)']
[u'3,823', u'995', u'(1,417)', u'(1,661)', u'(724)', u'(724)']
[u'(1,168)', u'4,953', u'(398)', u'(190)', u'3,137', u'3,137']
[u'(4,713)', u'(617)', u'(426)', u'(229)', u'\u2014', u'\u2014']
[u'232', u'\u2014', u'\u2014', u'\u2014', u'89', u'89']
[u'\u2014', u'5,513', u'\u2014', u'\u2014', u'3,037', u'3,037']
[u'\u2014', u'\u2014', u'(1)', u'\u2014', u'\u2014', u'\u2014']
[u'3,251', u'\u2014', u'\u2014', u'0', u'\u2014', u'\u2014']
[u'63', u'57', u'29', u'39', u'12', u'12']
[u'(2,207)', u'(3,843)', u'(604)', u'(168)', u'(3,026)', u'(3,026)']
[u'(1,482)', u'\u2014', u'\u2014', u'\u2014', u'\u2014', u'\u2014']
[u'1,816', u'\u2014', u'\u2014', u'\u2014', u'\u2014', u'\u2014']
[u'(151)', u'\u2014', u'\u2014', u'\u2014', u'\u2014', u'\u2014']
[u'(410)', u'(341)', u'\u2014', u'\u2014', u'\u2014', u'\u2014']
[u'(1,980)', u'(3,502)', u'(604)', u'(168)', u'(3,026)', u'(3,026)']
[u'136', u'(435)', u'(506)', u'140', u'(403)', u'(403)']
[u'1,806', u'1,318', u'884', u'377', u'518', u'518']
[u'1,941', u'884', u'377', u'518', u'115', u'115']
[u'\xa0', u'\xa0', u'\xa0', u'\xa0', u'\xa0', u'\xa0']
[u'3,511', u'(1,545)', u'495', u'498', u'(513)', u'(513)']
[u'(4,713)', u'(617)', u'(426)', u'(229)', u'\u2014', u'\u2014']
[u'(1,203)', u'(2,162)', u'69', u'269', u'(513)', u'(513)']

u'\u2014'是一个unicode _,您会在页面上看到缺失值。