I have the table below. I would like to scrape this table to have in output format a dictionary :
<h3>TITRE PRINCIPAL</h3>
<table>
<tr>
<th>Titre 1</th>
<th>Titre 2</th>
<th>Titre 3</th>
<th>Titre 4</th>
<th>Titre 5</th>
</tr>
<tr>
<td>Valeur A</td>
<td>Valeur B</td>
<td>Valeur C</td>
<td>Valeur D</td>
<td>Valeur E</td>
</tr>
<tr>
<td>Valeur F</td>
<td>Valeur G</td>
<td>Valeur H</td>
<td>Valeur I</td>
<td>Valeur J</td>
</tr>
<tr>
<td>Valeur K</td>
<td>Valeur L</td>
<td>Valeur M</td>
<td>Valeur N</td>
<td>Valeur O</td>
</tr>
</table>
OUTPUT :
{
'Valeur A': ['Valeur B', 'Valeur C', 'Valeur D', 'Valeur E'],
'Valeur F': ['Valeur G', 'Valeur H', 'Valeur I', 'Valeur J'],
'Valeur K': ['Valeur L', 'Valeur M', 'Valeur N', 'Valeur O']
}
I'm doing this :
soup = BeautifulSoup(fichier_html, "html.parser")
for td in tr.findChildren():
I know that td.text
will give me the string contained in td but I can't organize my code to get what I want
Could someone help me?
CodePudding user response:
If html_doc
is your HTML code from the question, then:
soup = BeautifulSoup(html_doc, "html.parser")
trs = soup.select("tr:has(td)")
out = {tr.td.text: [td.text for td in tr.select("td")[1:]] for tr in trs}
print(out)
Prints:
{
"Valeur A": ["Valeur B", "Valeur C", "Valeur D", "Valeur E"],
"Valeur F": ["Valeur G", "Valeur H", "Valeur I", "Valeur J"],
"Valeur K": ["Valeur L", "Valeur M", "Valeur N", "Valeur O"],
}