以下命令正确地从 HTML 页面中提取表:
[tr.findAll('td') for tr in table.findAll('tr',{'class': "js-file-line"})]
[[<td class="blob-num js-line-number" data-line-number="1" id="L1"></td>],
[<td class="blob-num js-line-number" data-line-number="2" id="L2"></td>,
<td>Arsenal</td>,
<td>38</td>,
<td>26</td>,
<td>9</td>,
<td>3</td>,
<td>79</td>,
<td>36</td>,
<td>87</td>],
[<td class="blob-num js-line-number" data-line-number="3" id="L3"></td>,
<td>Liverpool</td>,
etc.
我想修改命令以提取每个 td 的内容。但我无法从每一行中提取文本,因为 .text 返回错误:我使用以下命令:
[tr.findAll('td').text[1:] for tr in table.findAll('tr',{'class': "js-file-line"})][1:]
其中 [1:] 用于跳过标头(它们工作正常。测试)。问题是导致以下错误的 .text:
ResultSet object has no attribute 'text'.
You're probably treating a list of items like a single item.
Did you call find_all() when you meant to call find()?
我实际上正在使用 findAll,根据我的理解,它等同于find_All。
对不起,如果这是太基本的问题...
find_All
方法返回一个 ResultSet
对象,该对象基本上是Tag
对象的列表。
text
是一个Tag
属性,因此您应该再使用一个列表理解。
txt = [
[td.text for td in tr.find_all('td')][1:]
for tr in table.find_all('tr', {'class': "js-file-line"})
][1:]
或者,如果行仅包含"td"标记,则可以使用strings
生成器。
txt = [list(tr.strings)[1:] for tr in table.find_all('tr', {'class': "js-file-line"})][1:]