2016-08-14 9 views
0

私はBeautifulSoupとPythonを使用してオンラインでデータをスクラップするプロジェクトを持っています。歴史的な株データは私にとっては実用的なものになると思います。私は、ソースコードhereを見て、BeautifulSoupのselect()またはfindall()を使ってテーブルのデータの一部を解析する方法を分析しました。ここで私が使用するコードはありますが、テーブル以外のものを解析しました。BeautifulSoupを使用してデータのテーブルの一部を解析する

soup = bs4.BeautifulSoup(res.text, 'lxml') table = soup.findAll('td', {'class':'yfnc_tabledata1'}) print table

私の質問:どのように私はテーブルからのデータの2日間を示すだけで2行を解析するには?ここで

は、履歴データの2日間を持つテーブルである:

<table class="yfnc_datamodoutline1" width="100%" cellpadding="0" cellspacing="0" border="0"> 

<tr valign="top"> 
<td> 

<table border="0" cellpadding="2" cellspacing="1" width="100%"> 
<tr> 
<th scope="col" class="yfnc_tablehead1" align="right" width="16%">Date</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="12%">Open</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="12%">High</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="12%">Low</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="12%">close</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="16%">Volume</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="15%">Adj Close*</th> 
</tr> 
<tr> 
<td class="yfnc_tabledata1" nowrap align="right">12 Aug 2016</td> 
<td class="yfnc_tabledata1" align="right">107.78</td> 
<td class="yfnc_tabledata1" align="right">108.44</td> 
<td class="yfnc_tabledata1" align="right">107.78</td> 
<td class="yfnc_tabledata1" align="right">108.18</td> 
<td class="yfnc_tabledata1" align="right">18,612,300</td> 
<td class="yfnc_tabledata1" align="right">108.18</td> 
</tr> 
<tr> 
<td class="yfnc_tabledata1" nowrap align="right">11 Aug 2016</td> 
<td class="yfnc_tabledata1" align="right">108.52</td> 
<td class="yfnc_tabledata1" align="right">108.93</td> 
<td class="yfnc_tabledata1" align="right">107.85</td> 
<td class="yfnc_tabledata1" align="right">107.93</td> 
<td class="yfnc_tabledata1" align="right">27,484,500</td> 
<td class="yfnc_tabledata1" align="right">107.93</td> 
</tr> 
<tr> 
<td class="yfnc_tabledata1" colspan="7" align="center"> 
* <small>Close price adjusted for dividends and splits.</small> 
</td> 
</tr> 
</table> 

</td> 
</tr> 
</table> 

私は上記のみからのデータの特定の2行必要があります:あなたはすべての行を選択することができます

<tr> 
<td class="yfnc_tabledata1" nowrap align="right">12 Aug 2016</td> 
<td class="yfnc_tabledata1" align="right">107.78</td> 
<td class="yfnc_tabledata1" align="right">108.44</td> 
<td class="yfnc_tabledata1" align="right">107.78</td> 
<td class="yfnc_tabledata1" align="right">108.18</td> 
<td class="yfnc_tabledata1" align="right">18,612,300</td> 
<td class="yfnc_tabledata1" align="right">108.18</td> 
</tr> 
<tr> 
<td class="yfnc_tabledata1" nowrap align="right">11 Aug 2016</td> 
<td class="yfnc_tabledata1" align="right">108.52</td> 
<td class="yfnc_tabledata1" align="right">108.93</td> 
<td class="yfnc_tabledata1" align="right">107.85</td> 
<td class="yfnc_tabledata1" align="right">107.93</td> 
<td class="yfnc_tabledata1" align="right">27,484,500</td> 
<td class="yfnc_tabledata1" align="right">107.93</td> 
</tr> 
+1

入れ子のレベルによって違いはありません。テーブルを取得するために 'find()'を使用した後、ネストを心配することなくその子にアクセスできます。あなたの実際の問題は何ですか?あなたはテーブルを見つけるのに問題がありますか? –

+0

私はテーブルを解析するだけでなく、ウェブページの他の部分も解析します。 –

答えて

0

soup = BeautifulSoup(html) 
table_rows = soup.select("table.yfnc_datamodoutline1 table tr + tr") 
row1, row2 = table_rows[0:2] 

print(row1) 
print(row2) 
yfnc_datamodoutline1テーブルとインデックス最初の二つの内側のネストされたテーブルから

<tr> 
<td align="right" class="yfnc_tabledata1" nowrap="">12 Aug 2016</td> 
<td align="right" class="yfnc_tabledata1">107.78</td> 
<td align="right" class="yfnc_tabledata1">108.44</td> 
<td align="right" class="yfnc_tabledata1">107.78</td> 
<td align="right" class="yfnc_tabledata1">108.18</td> 
<td align="right" class="yfnc_tabledata1">18,612,300</td> 
<td align="right" class="yfnc_tabledata1">108.18</td> 
</tr> 
<tr> 
<td align="right" class="yfnc_tabledata1" nowrap="">11 Aug 2016</td> 
<td align="right" class="yfnc_tabledata1">108.52</td> 
<td align="right" class="yfnc_tabledata1">108.93</td> 
<td align="right" class="yfnc_tabledata1">107.85</td> 
<td align="right" class="yfnc_tabledata1">107.93</td> 
<td align="right" class="yfnc_tabledata1">27,484,500</td> 
<td align="right" class="yfnc_tabledata1">107.93</td> 
</tr> 

をTDデータは、単に各tdからテキストを抽出取得するには:

print([td.text for td in row1.find_all("td")]) 
print([td.text for td in row2.find_all("td")]) 

あなたを与えることになる:あなたを与えるだろう

[u'12 Aug 2016', u'107.78', u'108.44', u'107.78', u'108.18', u'18,612,300', u'108.18'] 
[u'11 Aug 2016', u'108.52', u'108.93', u'107.85', u'107.93', u'27,484,500', u'107.93'] 

table.yfnc_datamodoutline1テーブルtr + trは、最初の行をスキップしている内部テーブル内のすべての行を選択します。

+0

table.yfnc_datamodoutline1テーブルtr + trは2行を解析します。解析するデータの行数が異なる場合の対処方法 –

+0

@LEDFantom、私はあなたが 'mean.table.yfnc_datamodoutline1 table tr + tr parses'が最初の行を含まないすべての行を解析するかどうか分かりません –

関連する問題