【发布时间】:2020-05-14 21:07:37
【问题描述】:
假设我有以下 HTML 表格:
<table>
<tr>
<th>Name</th>
<th>Age</th>
<th>License</th>
<th>Amount</th>
</tr>
<tr>
<td>John</td>
<td>28</td>
<td>Y</td>
<td>12.30</td>
</tr>
<tr>
<td>Kevin</td>
<td>25</td>
<td>Y</td>
<td>22.30</td>
</tr>
<tr>
<td>Smith</td>
<td>38</td>
<td>Y</td>
<td>52.20</td>
</tr>
<tr>
<td>Stewart</td>
<td>21</td>
<td>N</td>
<td>3.80</td>
</tr>
</table>
我想将此表转换为 JSON,可能采用以下格式:
data= [
{
Name: 'John',
Age: 28,
License: 'Y',
Amount: 12.30
},
{
Name: 'Kevin',
Age: 25,
License: 'Y',
Amount: 22.30
},
{
Name: 'Smith',
Age: 38,
License: 'Y',
Amount: 52.20
},
{
Name: 'Stewart',
Age: 21,
License: 'N',
Amount: 3.80
}
];
我看到了另一个与上述类似的例子,我找到了here。 但是,鉴于该答案,有几件事我无法解决。它们是:
- 它被限制在表格上的两行。如果我添加额外的行,我会收到错误:
print(json.dumps(OrderedDict(table_data))) ValueError: 值太多 解包(预计 2 个)
- 不考虑表格的标题行。
这是我目前的代码:
html_data = """
<table>
<tr>
<th>Name</th>
<th>Age</th>
<th>License</th>
<th>Amount</th>
</tr>
<tr>
<td>John</td>
<td>28</td>
<td>Y</td>
<td>12.30</td>
</tr>
<tr>
<td>Kevin</td>
<td>25</td>
<td>Y</td>
<td>22.30</td>
</tr>
<tr>
<td>Smith</td>
<td>38</td>
<td>Y</td>
<td>52.20</td>
</tr>
<tr>
<td>Stewart</td>
<td>21</td>
<td>N</td>
<td>3.80</td>
</tr>
</table>
"""
from bs4 import BeautifulSoup
from collections import OrderedDict
import json
table_data = [[cell.text for cell in row("td")]
for row in BeautifulSoup(html_data, features="lxml")("tr")]
print(json.dumps(OrderedDict(table_data)))
但我收到以下错误:
print(json.dumps(OrderedDict(table_data))) ValueError: 需要超过 0 个要解压的值
编辑 如果 HTML 中只有一个表格,则下面的答案非常有效。如果有两张桌子怎么办?例如:
<html>
<body>
<h1>My Heading</h1>
<p>Hello world</p>
<table>
<tr>
<th>Name</th>
<th>Age</th>
<th>License</th>
<th>Amount</th>
</tr>
<tr>
<td>John</td>
<td>28</td>
<td>Y</td>
<td>12.30</td>
</tr>
<tr>
<td>Kevin</td>
<td>25</td>
<td>Y</td>
<td>22.30</td>
</tr>
<tr>
<td>Smith</td>
<td>38</td>
<td>Y</td>
<td>52.20</td>
</tr>
<tr>
<td>Stewart</td>
<td>21</td>
<td>N</td>
<td>3.80</td>
</tr>
</table>
<table>
<tr>
<th>Name</th>
<th>Age</th>
<th>License</th>
<th>Amount</th>
</tr>
<tr>
<td>Rich</td>
<td>28</td>
<td>Y</td>
<td>12.30</td>
</tr>
<tr>
<td>Kevin</td>
<td>25</td>
<td>Y</td>
<td>22.30</td>
</tr>
<tr>
<td>Smith</td>
<td>38</td>
<td>Y</td>
<td>52.20</td>
</tr>
<tr>
<td>Stewart</td>
<td>21</td>
<td>N</td>
<td>3.80</td>
</tr>
</table>
</body>
</html>
如果我在下面的代码中插入这个,只有第一个表显示为 JSON 输出。
【问题讨论】: