Извлечение значения класса из TD - - PullRequest
1 голос
/ 10 января 2020

Используя BeautifulSoup4, я могу сузить таблицу до мелочей и хочу извлечь из нее две вещи: 1) текст (что я могу сделать) 2) значение класса (что я не могу сделать).

Фрагмент html Я принимаю:

    <table id="allergen_list">
    <thead>
        <tr>
            <th style="text-align: left;">Date</th>
            <th style="text-align: right;">Fungus</th>
            <th style="text-align: right;">Mountain<br />Cedar</th>
        </tr>
    </thead>
    <tbody>
        <tr><td style="text-align: left;">Jan 1</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
        <tr><td style="text-align: left;">Jan 2</td><td style="text-align: right;" class="pollen_color_low">3,410</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
        <tr><td style="text-align: left;">Jan 3</td><td style="text-align: right;" class="pollen_color_low">3,023</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
        <tr><td style="text-align: left;">Jan 4</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
        <tr><td style="text-align: left;">Jan 5</td><td style="text-align: right;" class="pollen_color_low">3,720</td><td style="text-align: right;" class="pollen_color_moderate">31</td></tr>
        <tr><td style="text-align: left;">Jan 6</td><td style="text-align: right;" class="pollen_color_low">4,108</td><td style="text-align: right;" class="pollen_color_moderate">16</td></tr>
        <tr><td style="text-align: left;">Jan 7</td><td style="text-align: right;" class="pollen_color_low">4,496</td><td style="text-align: right;" class="pollen_color_moderate">16</td></tr>
        <tr><td style="text-align: left;">Jan 8</td><td style="text-align: right;" class="pollen_color_low">3,953</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
        <tr><td style="text-align: left;">Jan 9</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
    </tbody>
</table>

Фрагмент кода:

    soup = BeautifulSoup(page, 'lxml')
    ...
    for row in the_table.find_all('tr'):
    pollen = row.find_all('th')
    print(pollen)
    cells = row.find_all('td')
    print(cells)
    num=len(cells) #or find in th..
    if num>0:
        for i in range(0,num):
            print(cells[i].find(text=True))
            print(cells[i].find("class", re.compile("^pollen_color")))      
    print("-*-*-*")

Результат:

[<th style="text-align: left;">Date</th>, <th style="text-align: right;">Fungus</th>, <th style="text-align: right;">Mountain<br/>Cedar</th>]
[]
-*-*-*
[]
[<td style="text-align: left;">Jan 1</td>, <td class="pollen_color_absent" style="text-align: right; color: #999999;">0</td>, <td class="pollen_color_absent" style="text-align: right; color: #999999;">0</td>]
Jan 1
None
0
None
0
None
-*-*-*
[]
[<td style="text-align: left;">Jan 2</td>, <td class="pollen_color_low" style="text-align: right;">3,410</td>, <td class="pollen_color_absent" style="text-align: right; color: #999999;">0</td>]
Jan 2
None
3,410
None
0
None
-*-*-*

Нет - это то место, где я ожидаю / надеюсь увидеть "pollen_color_absent" и др. c. Как я могу извлечь класс из *

Помощь / наставничество волшебника так высоко ценится!

1 Ответ

1 голос
/ 10 января 2020

Вот пример того, как извлечь класс, используя BeautifulSoup4.

from bs4 import BeautifulSoup

html = '''<table id="allergen_list">
    <thead>
        <tr>
            <th style="text-align: left;">Date</th>
            <th style="text-align: right;">Fungus</th>
            <th style="text-align: right;">Mountain<br />Cedar</th>
        </tr>
    </thead>
    <tbody>
        <tr><td style="text-align: left;">Jan 1</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
        <tr><td style="text-align: left;">Jan 2</td><td style="text-align: right;" class="pollen_color_low">3,410</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
        <tr><td style="text-align: left;">Jan 3</td><td style="text-align: right;" class="pollen_color_low">3,023</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
        <tr><td style="text-align: left;">Jan 4</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
        <tr><td style="text-align: left;">Jan 5</td><td style="text-align: right;" class="pollen_color_low">3,720</td><td style="text-align: right;" class="pollen_color_moderate">31</td></tr>
        <tr><td style="text-align: left;">Jan 6</td><td style="text-align: right;" class="pollen_color_low">4,108</td><td style="text-align: right;" class="pollen_color_moderate">16</td></tr>
        <tr><td style="text-align: left;">Jan 7</td><td style="text-align: right;" class="pollen_color_low">4,496</td><td style="text-align: right;" class="pollen_color_moderate">16</td></tr>
        <tr><td style="text-align: left;">Jan 8</td><td style="text-align: right;" class="pollen_color_low">3,953</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
        <tr><td style="text-align: left;">Jan 9</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td><td style="text-align: right; color: #999999;" class="pollen_color_absent">0</td></tr>
    </tbody>
</table>'''

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

tbody = soup.find('tbody')
rows = tbody.find_all('tr')
for row in rows:
    cols = row.find_all('td')
    for col in cols:
        print(col.text)
        if col.has_attr('class'):
            print(col.get('class'))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...