私は非常に異なるアプローチを取るでしょう。HTMLページのスクレイピングにLXMLを使用しています
切り替えた理由の 1 つは、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)
ページを見ると、データが 2 つのテーブルに分割されていることがわかります。EPS が必要なので、2 番目の表にあることに注意しました。これをプログラムで整理するコードを書くこともできますが、それはあなたに任せます。
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 リストの最初の項目 (辞書) には最初の行のデータが含まれ、2 番目の項目には 2 番目の行のデータが含まれます。
lxml の新しいビルドが必要なときは、UC-IRVINEの本当にいい人が管理しているページにアクセスします。
これが役立つことを願っています