在我看来这是来自:
[[td.text for td in row.find_all("td")] for row in table[2].select("tr + tr") if row]
如果我们看一下您的html,它有一个通用的表单:
<table>
<tr><td></td></tr>
<tr><td></td></tr>
<!-- note this tr has no tds -->
<tr><th></th><!-- ... --></tr>
<tr><td></td><!-- ... --></tr>
请注意,从中获取标题的行是
<tr>
前面紧接着
<tr>
(这与
tr + tr
)中。但是因为它没有
<td>
在里面,这个列表理解是空的:
[td.text for td in row.find_all("td")]
是的。
我建议采用以下方法,而不是这种方法:
-
收集所有
<tr>
表中的S:
rows = table.select('tr')
-
从列表顶部移除行,直到找到标题(一个带有多个
<th>
(第页)
-
然后,现在头已经被剥离,您可以使用对其余行的列表理解来提取数据:
[[td.text for td in row] for row in rows]
或者,如果您不需要对数据进行任何处理(只想将其直接转换为csv),则只需执行一个列表理解并提取
<th>
S或
<td>
S.
[[x.text for x in row.find_all('td, th')] for row in table.select('tr')]