Python Conditionally Add Class to <td> Tags in HTML Table
<p>I have some data in the form of a csv file that I'm reading into Python and converting to an HTML table using Pandas.</p>

<p>Heres some example data:</p>

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

<p>And some code:</p>

<pre><code>import pandas as pd
df = pd.read_csv("data.csv")
table = df.to_html(index=False)
</code></pre>

<p>This creates the following HTML:</p>

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

<p>No I want to conditionally add a class to each cell in the html table if its value is less than a certain threshold. The threshold is different for each row in the table.  </p>

<p>So given the example data above, I want to add a class, class="custom" to cell col2 with name A and to cell col1 with name C.  In CSS, I will then fill the cell color as red if it has the "custom" class.</p>

<p>The result would be something like:  </p>

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

<p>How can this be achieved using Beautiful Soup?</p>

<p>Using  <em>BeautifulSoup</em> you can add a class to the tags attrs as you would set a key/value in a dictionary:</p>

<pre><code>soup = BeautifulSoup(html,"html.parser")

for row in soup.select("tbody tr"):
    tds = row.find_all("td")     
    if int(tds[3].text) &lt; int(tds[1].text):
        tds[3]["class"] = "custom"
     if int(tds[2].text) &lt; int(tds[1].text):
        tds[2]["class"] = "custom"
</code></pre>

<p>Which using your input html would give you:</p>

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

<p>Just use whatever it is in the if that decides whether to add it or not.</p>

python html pandas beautifulsoup