2016-09-20 73 views
0

我有一些csv文件形式的數據,我正在讀入Python並使用Pandas轉換爲HTML表格。Python有條件地將類添加到​​HTML表中的標記

下面有一些示例數據:

name threshold col1 col2 col3 
A  10   12 9 13 
B  15   18 17 23 
C  20   19 22 25 

而且一些代碼:

import pandas as pd 
df = pd.read_csv("data.csv") 
table = df.to_html(index=False) 

這將創建下列HTML:

<table border="1" class="dataframe"> 
    <thead> 
    <tr style="text-align: right;"> 
     <th>name</th> 
     <th>threshold</th> 
     <th>col1</th> 
     <th>col2</th> 
     <th>col3</th> 
    </tr> 
    </thead> 
    <tbody> 
    <tr> 
     <td>A</td> 
     <td>10</td> 
     <td>12</td> 
     <td>9</td> 
     <td>13</td> 
    </tr> 
    <tr> 
     <td>B</td> 
     <td>15</td> 
     <td>18</td> 
     <td>17</td> 
     <td>23</td> 
    </tr> 
    <tr> 
     <td>C</td> 
     <td>20</td> 
     <td>19</td> 
     <td>22</td> 
     <td>25</td> 
    </tr> 
    </tbody> 
</table> 

不,我想要一類有條件地添加到每個如果它的值小於特定的閾值,那麼它就是html表格中的單元格。表中的每一行的閾值都不相同。因此,考慮到上面的示例數據,我想添加一個class class =「custom」給名爲A的單元格col2和名爲C的單元格col1。在CSS中,我將填充單元格顏色爲紅色if它有「自定義」類。

結果會是這樣的:

<table border="1" class="dataframe"> 
    <thead> 
    <tr style="text-align: right;"> 
     <th>name</th> 
     <th>threshold</th> 
     <th>col1</th> 
     <th>col2</th> 
     <th>col3</th> 
    </tr> 
    </thead> 
    <tbody> 
    <tr> 
     <td>A</td> 
     <td>10</td> 
     <td>12</td> 
     <td class="custom">9</td> 
     <td>13</td> 
    </tr> 
    <tr> 
     <td>B</td> 
     <td>15</td> 
     <td>18</td> 
     <td>17</td> 
     <td>23</td> 
    </tr> 
    <tr> 
     <td>C</td> 
     <td>20</td> 
     <td class="custom">19</td> 
     <td>22</td> 
     <td>25</td> 
    </tr> 
    </tbody> 
</table> 

如何使用這個美麗的湯可以實現嗎?

回答

0

使用BeautifulSoup你可以添加一個類的標籤ATTRS,你會設定在字典中的鍵/值:使用您輸入HTML會給你

soup = BeautifulSoup(html,"html.parser") 

for row in soup.select("tbody tr"): 
    tds = row.find_all("td")  
    if int(tds[3].text) < int(tds[1].text): 
     tds[3]["class"] = "custom" 
    if int(tds[2].text) < int(tds[1].text): 
     tds[2]["class"] = "custom" 

其中:

<html><body><table border="1" class="dataframe"> 
<thead> 
<tr style="text-align: right;"> 
<th>name</th> 
<th>threshold</th> 
<th>col1</th> 
<th>col2</th> 
<th>col3</th> 
</tr> 
</thead> 
<tbody> 
<tr> 
<td>A</td> 
<td>10</td> 
<td>12</td> 
<td class="custom">9</td> 
<td>13</td> 
</tr> 
<tr> 
<td>B</td> 
<td>15</td> 
<td>18</td> 
<td>17</td> 
<td>23</td> 
</tr> 
<tr> 
<td>C</td> 
<td>20</td> 
<td class="custom">19</td> 
<td>22</td> 
<td>25</td> 
</tr> 
</tbody> 
</table></body></html> 

只要使用它就可以決定是否添加它。

+0

在我的情況下,df.to_html()返回一個類型unicode,因爲我的df是一個數據框。然後我不能使用美麗的湯功能中的「html.parser」。我上面提到的標準是,如果該值小於該行的閾值列中的值,則添加「自定義」類,否則不做任何操作並繼續下一個。 – brno792

+0

通過unicode的問題是什麼? –

+0

使用BeautifulSoup(html,「html.parser」)時出現錯誤:AttributeError:'str'對象沒有屬性'text'。在我的情況下,html是unicode類型,它來自:html = pd.read_csv(「data.csv」)。to_html(index = False) – brno792