我会采取非常不同的方法。我们使用 LXML 来抓取 html 页面
我们切换的原因之一是因为 BS 有一段时间没有维护 - 或者我应该说更新了。
在我的测试中,我运行了以下
import requests
from lxml import html
from collections import OrderedDict
page_as_string = requests.get('http://www.marketwatch.com/investing/stock/goog/financials').content
tree = html.fromstring(page_as_string)
现在我查看了页面,我看到数据分为两个表。既然你想要 EPS,我注意到它在第二个表中。我们可以编写一些代码以编程方式解决这个问题,但我会把它留给你。
tables = [ e for e in tree.iter() if e.tag == 'table']
eps_table = tables[-1]
现在我注意到第一行有列标题,所以我想分隔所有行
table_rows = [ e for e in eps_table.iter() if e.tag == 'tr']
现在让我们获取列标题:
column_headings =[ e.text_content() for e in table_rows[0].iter() if e.tag == 'th']
最后,我们可以将列标题映射到行标签和单元格值
my_results = []
for row in table_rows[1:]:
cell_content = [ e.text_content() for e in row.iter() if e.tag == 'td']
temp_dict = OrderedDict()
for numb, cell in enumerate(cell_content):
if numb == 0:
temp_dict['row_label'] = cell.strip()
else:
dict_key = column_headings[numb]
temp_dict[dict_key] = cell
my_results.append(temp_dict)
现在访问结果
for row_dict in my_results:
if row_dict['row_label'] == 'EPS (Basic)':
for key in row_dict:
print key, ':', row_dict[key]
row_label : EPS (Basic)
2008 : 13.46
2009 : 20.62
2010 : 26.69
2011 : 30.17
2012 : 32.81
5-year trend :
现在还有更多工作要做,例如我没有测试正方形(每行中的单元格数相等)。
最后,我是一个新手,我怀疑其他人会建议使用更直接的方法来获取这些元素(xPath 或 cssselect),但这确实有效,并且它以一种很好的结构化方式从表中获取所有内容。
我应该补充一点,表中的每一行都是可用的,它们是原始行顺序。my_results 列表中的第一项(这是一个字典)包含来自第一行的数据,第二项包含来自第二行的数据,依此类推。
当我需要一个新的 lxml 构建时,我访问了一个由UC-IRVINE的一个非常好的人维护的页面
我希望这有帮助