2015-05-10 400 views
1

我想從網頁中提取表格。下面是使用beautifulsoup的HTML和Python代碼。下面的代碼總是爲我工作,但在這種情況下,我變得空白。提前致謝。使用Python提取HTML表格BeautifulSoup

<table> 
<thead> 
<tr> 
<th>Period Ending:</th> 
<th class="TalignL">Trend</th> 
<th>9/27/2014</th> 
<th>9/28/2013</th> 
<th>9/29/2012</th> 
<th>9/24/2011</th> 
</tr> 
</thead> 
<tr> 
<th bgcolor="#E6E6E6">Total Revenue</th> 
<td class="td_genTable"><table border="0" align="center" width="*" cellspacing="0" cellpadding="0"><tr><td align="bottom"><table border="0" height="100%" cellspacing="0" cellpadding="0"><tr><td><table cellspacing="0" cellpadding="0" border="0"><tr><td height="15" bgcolor="#47C3D3" width="6"></td><td height="15" bgcolor="#FFFFFF" width="1px"></td></tr><tr><td height="1" colspan="2" bgcolor="#D1D1D1"></td></tr></table></td><td><table cellspacing="0" cellpadding="0" border="0"><tr><td height="1" bgcolor="#FFFFFF" width="6"></td><td height="1" bgcolor="#FFFFFF" width="1px"></td></tr><tr><td height="14" bgcolor="#47C3D3" width="6"></td><td height="14" bgcolor="#FFFFFF" width="1px"></td></tr><tr><td height="1" colspan="2" bgcolor="#D1D1D1"></td></tr></table></td><td><table cellspacing="0" cellpadding="0" border="0"><tr><td height="2" bgcolor="#FFFFFF" width="6"></td><td height="2" bgcolor="#FFFFFF" width="1px"></td></tr><tr><td height="13" bgcolor="#47C3D3" width="6"></td><td height="13" bgcolor="#FFFFFF" width="1px"></td></tr><tr><td height="1" colspan="2" bgcolor="#D1D1D1"></td></tr></table></td><td><table cellspacing="0" cellpadding="0" border="0"><tr><td height="7" bgcolor="#FFFFFF" width="6"></td><td height="7" bgcolor="#FFFFFF" width="1px"></td></tr><tr><td height="8" bgcolor="#47C3D3" width="6"></td><td height="8" bgcolor="#FFFFFF" width="1px"></td></tr><tr><td height="1" colspan="1" bgcolor="#D1D1D1"></td></tr></table></td></tr></table></td></tr></table></td> 
<td>$182,795,000</td> 
<td>$170,910,000</td> 
<td>$156,508,000</td> 
<td>$108,249,000</td> 
rows = table.findAll('tr') 

    for row in rows: 
     cols = row.findAll('td') 
     col1 = [ele.text.strip().replace(',','') for ele in cols] 

     account = col1[0:1] 
     period1 = col1[2:3] 
     period2 = col1[3:4] 
     period3 = col1[4:5] 

     record = (stock, account,period1,period3,period3) 
     print record 
+1

你第一個非標題行的第一列包含一個充滿空單元格的表格,其中沒有文本。你的代碼正確地發現沒有文字。我不確定你想要它做什麼。 – abarnert

+0

同時,您爲什麼使用不推薦的名稱'findAll'?您是否從針對BS3編寫的示例代碼學習,而不是從BS4的更新示例或文檔中學習? – abarnert

+0

最後,['find_all'](http://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all)(或'findAll')搜索_all後代_,而不僅僅是頂級子代。因此,除非您想遍歷外部表的行和嵌入在該表的列中的每個子表的行並將它們對待,否則您不應該在此處使用它。 – abarnert

回答

2

添加到什麼@abarnert指出。我會得到所有的td元素與文本開始$

for row in soup.table.find_all('tr', recursive=False): 
    record = [td.text.replace(",", "") for td in row.find_all("td", text=lambda x: x and x.startswith("$"))] 
    print record 

對於您所提供的輸入,它打印:

[u'$182795000', u'$170910000', u'$156508000', u'$108249000'] 

,你可以「解壓縮」成獨立的變量:

account, period1, period2, period3 = record 

請注意,我明確地通過recursive=False,以避免深入樹中,只得到tr孩子的table元素。

1

你的第一個問題是:find_all(或findAll,這僅僅是同樣的事情被棄用的代名詞),不只是發現在表中的行,發現在表和內它的每一個子表中的行。你幾乎肯定不想迭代兩種行,並在每一行上運行相同的代碼。如果你不想要那樣,the recursive argument文檔說,通過recursive=False

所以,現在你只回到一行。如果你做row.find_all('td'),那又會有同樣的問題 - 你會找到這一行的所有列,以及其中一列中的每個子表中的每一行的所有列。再次,這不是你想要的,所以使用recursive=False

現在你回來只有5列。第一個只是一個大桌子,裏面有一大堆空單元;另一方面,其他人擁有美元價值,這似乎是你想要的。


所以,僅僅增加recursive=False到兩個呼叫,並設置stock的東西(我不知道它應該來自於你的代碼,但沒有它你顯然會先手NameError ):

stock = 'spam' 

rows = table.find_all('tr', recursive=False) 

for row in rows: 
    cols = row.findAll('td', recursive=False) 
    col1 = [ele.text.strip().replace(',','') for ele in cols] 

    account = col1[0:1] 
    period1 = col1[2:3] 
    period2 = col1[3:4] 
    period3 = col1[4:5] 

    record = (stock, account,period1,period3,period3) 

    print record 

這將打印:

('spam', [''], ['$170910000'], ['$108249000'], ['$108249000']) 

我不知道爲什麼你使用period3兩次,從未使用過period2,爲什麼你完全跳過了第1列,或者你爲什麼要切分1元素列表而不是索引值,但無論如何,這似乎就是你想要做的。


作爲一個側面說明,如果你真的想打出來的清單到5個值,而不是進入4跳過的一個值1元的列表,你可以寫:

account, whatever, period1, period2, period3 = col 
+1

@alecxe:要編寫書籍,你必須能夠編輯東西。我的第一章是1300頁。 (這可能適用於小說,但Tristam Shandy已經在250年前寫過了......) – abarnert

+0

這個工作!謝謝。你是對的。我正在使用股票作爲變量來循環多個股票。再次感謝。 –

相關問題