2016-08-14 47 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

您可以選擇所有的行來自嵌套表yfnc_datamodoutline1表和索引前兩個:

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

print(row1) 
print(row2) 

這將使你:

<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'解析了所有不包含第一行的行 –