Если я вижу тег таблицы, я обычно позволяю пандам делать работу, и вы можете отфильтровать столбцы, которые вам не нужны или не нужны.
html = """
<table>
<tr>
<th>Header</th>
</tr>
<tr>
<td class="table-rank">1</td>
<td class="table-name">John</td>
<td class="table-name">Jim</td>
<td class="table-place">Russia</td>
<td class="table-score">2-1</td>
</tr>
</table>
"""
import pandas as pd
df = pd.read_html(html, skiprows=1)
results = df[0]
EDIT:
Если вас больше волнуют фактические атрибуты класса, я могу предложить 2 варианта.
Опция: 1
По-прежнему используйте pandas для анализа таблицы, но до этого используйте BeautifulSoup для удаления нежелательных столбцов / тегов / класса (как бы вы их ни называли) с помощью .decompose()
:
import pandas as pd
import bs4
html = """
<table>
<tr>
<th>Header</th>
</tr>
<tr>
<td class="table-rank">1</td>
<td class="table-name">John</td>
<td class="table-name">Jim</td>
<td class="table-place">Russia</td>
<td class="table-score">2-1</td>
</tr>
</table>
"""
soup = bs4.BeautifulSoup(html, 'html.parser')
keep_list = ["table-name", "table-score"]
for data in soup.find_all('td'):
class_attr = data['class'][0]
if class_attr in keep_list:
continue
else:
soup.select("td."+class_attr)[0].decompose()
df = pd.read_html(str(soup), skiprows=1)
results = df[0]
Выход:
print (results)
0 1 2
0 John Jim 2-1
Опция: 2
Подобно другим решениям, просто найдите определенные атрибуты класса.
import bs4
html = """
<table>
<tr>
<th>Header</th>
</tr>
<tr>
<td class="table-rank">1</td>
<td class="table-name">John</td>
<td class="table-name">Jim</td>
<td class="table-place">Russia</td>
<td class="table-score">2-1</td>
</tr>
</table>
"""
soup = bs4.BeautifulSoup(html, 'html.parser')
keep_list = ["table-name", "table-score"]
alpha = soup.find_all('td', class_=lambda x: x in keep_list)
for data in alpha:
print (data.text)
# or if wanted in list
results = [ data.text for data in alpha ]
Выход:
John
Jim
2-1
В качестве альтернативы, список можно сделать в 3 строки:
soup = bs4.BeautifulSoup(html, 'html.parser')
keep_list = ["table-name", "table-score"]
results = [ data.text for data in soup.find_all('td', class_=lambda x: x in keep_list)]
Выход:
print (results)
['John', 'Jim', '2-1']