我是 Python(和编程)新手,并且是第一次使用 BeautifulSoup
。
我正在尝试找到解析 html 表格内容并将其转换为字典的最佳方法 - 最好以最不脆弱的方式。
这是我尝试解析的 HTML 示例(我已经为我尝试选取的文本输入了键值数字)。
<div class="tablename">
<table border="0" cellpadding="0" cellspacing="0" style="border: 1px solid #dddddd; border-collapse: collapse; font-family: Arial, Helvetica, sans-serif; font-size: 14px; margin: 0; padding: 0; width: 100%">
<thead>
<tr>
<th colspan="4" style="background-color: #000; border: 1px solid #616161; color: #ffffff; font-size: 14px; font-weight: bold; line-height: 20px; padding: 14px 20px 12px 20px; text-align: left">Some text not needed</th>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 20px"> </td>
<td style="border-bottom: 1px solid #dddddd; color: #666666; font-size: 14px; line-height: 20px; padding: 11px 20px 10px 0; text-align: left; width: 42.5%; vertical-align: middle">Key 1</td>
<td style="border-bottom: 1px solid #dddddd; color: #000; font-size: 14px; line-height: 20px; padding: 11px 0 10px 0; text-align: left; vertical-align: middle">Value 1</td>
<td style="width: 20px"> </td>
</tr>
<tr>
<td> </td>
<td style="border-bottom: 1px solid #dddddd; color: #666666; font-size: 14px; line-height: 20px; padding: 11px 20px 10px 0; text-align: left; vertical-align: middle">Key 2</td>
<td style="border-bottom: 1px solid #dddddd; color: #000; font-size: 14px; line-height: 20px; padding: 11px 0 10px 0; text-align: left; vertical-align: middle">Value 2</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td style="border-bottom: 1px solid #dddddd; color: #666666; font-size: 14px; line-height: 20px; padding: 11px 20px 10px 0; text-align: left; vertical-align: middle">Key 3</td>
<td style="border-bottom: 1px solid #dddddd; color: #000; font-size: 14px; line-height: 20px; padding: 11px 0 10px 0; text-align: left; vertical-align: middle">Value 3</td>
<td> </td>
</tr>
<tr>
我正在使用的代码:
import requests
from bs4 import BeautifulSoup
html = requests.get('https://examplewebaddress.com')
soup = BeautifulSoup(html.text)
print(soup.tbody.text)
然后我可以循环 soup.tbody.text
字符串并将其拆分为键值对。但这似乎不是一个好方法,我似乎通过将其转换为字符串然后将其重新构建到字典中而丢失了表的结构。
是否有更直接的方法将带有 BeautifulSoup
(或更合适的东西)的表解析为我可以使用的字典?
最佳答案
这个想法是迭代表行,并为每行提取代表 future 字典的键和值的第二个和第三个单元格的文本:
soup = BeautifulSoup(html.text)
result = dict([[item.get_text(strip=True) for item in row.find_all('td')[1:3]]
for row in soup.select("div.tablename table tr")[1:]])
print result
对于提供的示例数据,它打印:
{u'Key 1': u'Value 1', u'Key 2': u'Value 2', u'Key 3': u'Value 3'}
div.tablename table tr
是 CSS selector它将匹配以 class="tablename"
作为父级的 div
的 table
元素下的所有 tr
元素。我们对 select
([1:]
) 的结果进行切片以跳过第一个标题行。
关于python - 将 html 表转换为字典而不丢失结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29395788/