Я хочу использовать beautifulsoup для очистки HTML, чтобы вытащить только два столбца из каждой строки в одной таблице. Тем не менее, каждая строка «tr» имеет 10 ячеек «td», и я хочу только ячейки «td» [1] и [8] из каждой строки. Какой самый питонный способ сделать это?
Из моего ввода ниже у меня есть одна таблица, одно тело, три строки и 10 ячеек на строку.
Input
<table id ="tblMain">
<tbody>
<tr>
<td "text"</td>
<td "data1"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "data2"</td>
<td "text"</td>
<tr>
<td "text"</td>
<td "data1"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "data2"</td>
<td "text"</td>
<tr>
<td "text"</td>
<td "data1"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "text"</td>
<td "data2"</td>
<td "text"</td>
Вещи, которые я пробовал
Я понимаю, как использовать индекс ячеек для циклического прохождения и получения «td» в [1] и [8]. Тем не менее, я все путаюсь, когда пытаюсь получить эти данные в одной строке, записанной обратно в CSV.
table = soup.find('table', {'id':'tblMain'} )
table_body = table.find('tbody')
rows = table_body.findAll('tr')
data1_columns = []
data2_columns = []
for row in rows[1:]:
data1 = row.findAll('td')[1]
data1_columns.append(data1.text)
data2 = row.findAll('td')[8]
data2_columns.append(data2.text)
Это мой текущий код , который находит таблицу, строки и все ячейки "td" и печатает их правильно в .csv. Однако вместо записи всех десяти ячеек "td" в строке обратно в строку csv я просто хочу взять "td" [1] и "td" [8].
html = browser.page_source
soup = BeautifulSoup(html, 'html.parser')
table = soup.find('table', {'id':'tblMain'} )
table_body = table.find('tbody')
rows = table_body.findAll('tr')
filename = '%s.csv' % reportname
with open(filename, "wt+", newline="") as f:
writer = csv.writer(f)
for row in rows:
csv_row = []
for cell in row.findAll("td"):
csv_row.append(cell.get_text())
writer.writerow(csv_row)
Ожидаемые результаты
Я хочу иметь возможность записать «td» [1] и «td» [8] обратно в мой csv_row, чтобы записать каждый список обратно в csv writer.writerow.
Запись строки обратно в csv_row, которая затем записывает в мой файл csv:
['data1', 'data2']
['data1', 'data2']
['data1', 'data2']