由于上一个问题不清楚,因此重写该问题。我正在尝试使用BeautifulSoup从HTML页面中检索元素。下面是我的HTML页面片段
<span class="cars">Imported</span><br>
<span class="auto"> Cycle 1 / Step 1</span>
<hr noshade><BR>
<table class="table" width="100%" border="0">
<colgroup>
<col width="200">
<col>
</colgroup>
<tr><td>Macro:</td><td align="left">abc</td></tr>
<tr><td>Comment: </td><td align="left">Valid</td></tr>
<tr><td>status:</td><td align="left" class="prog_stat_pass">PASS</td></tr>
</table></td></tr>
span class="cars">Exported</span><br>
<span class="manual"> Cycle 1 / Step 26</span>
<hr noshade><BR>
<table class="table" width="100%" border="0">
<colgroup>
<col width="200">
<col>
</colgroup>
<tr><td>Macro:</td><td align="left">def</td></tr>
<tr><td>Comment: </td><td align="left">Valid</td></tr>
<tr><td>status:</td><td align="left" class="prog_stat_blocked">BLOCKED</td></tr>
</table></td></tr>
span class="cars">Transferred</span><br>
<span class="manual"> Cycle 1 / Step 26</span>
<hr noshade><BR>
<table class="table" width="100%" border="0">
<colgroup>
<col width="200">
<col>
</colgroup>
<tr><td>Macro:</td><td align="left">efg</td></tr>
<tr><td>Comment: </td><td align="left">Invalid</td></tr>
<tr><td>status:</td><td align="left" class="prog_stat_fail">Failed</td></tr>
</table></td></tr>
我需要通过、失败和阻止状态以及它们相应的注释,存储在三个不同的列表中。我的输出应该是这样的:
PASS ['Valid']
FAIL ['Invalid']
BLOCKED ['Valid']
但我得到了这个:
PASS []
FAIL []
BLOCKED [['Valid,Valid,Invalid']]
我的代码:
self.table = self.soup_file.findAll(class_="table")
self.Macro = [column.findAll('td')[1].get_text() for column in self.table]
self.Comment = [column.findAll('td')[3].get_text() for column in self.table]
self.status = [column.findAll('td')[5].get_text() for column in self.table]
if self.status == "PASS":
self.pass_.append(self.Comment)
elif self.status == "FAIL":
self.fail_.append(self.Comment)
else:
self.blocked_.append(self.Comment)
只有第三个else条件显示为输出。这意味着,即使存在通过和失败状态,在尝试显示列表时,所有状态都存储在阻止(其他第三个(中。如果能解决的话会有很大的帮助。
提前谢谢。
您可以执行以下操作:
- 遍历表
- 将每个表的数据放入字典
- 将结果字典中的所有内容组合在一起,其中键是状态值
大致如下:
In [3]: from collections import defaultdict
In [4]: results = defaultdict(list)
In [5]: for table in soup.select('table.table'):
table_data = {row.td.get_text(strip=True).rstrip(':'): row('td')[-1].get_text(strip=True)
for row in table('tr')}
results[table_data['status']].append(table_data)
In [6]: dict(results)
Out[6]:
{'PASS': [{'Macro': 'abc', 'Comment': 'Valid', 'status': 'PASS'}],
'BLOCKED': [{'Macro': 'def', 'Comment': 'Valid', 'status': 'BLOCKED'}],
'Failed': [{'Macro': 'efg', 'Comment': 'Invalid', 'status': 'Failed'}]}