使用BeautifulSoup打印表格的第二列文本

5

我编写了这段代码来从页面的表格中获取文本。当我将其用于第一列时,它可以正常工作:

from bs4 import BeautifulSoup
import urllib2 #xbmc, xbmcgui, xbmcaddon

url = 'http://racing4everyone.eu/formula-e-201516/'
page = urllib2.urlopen(url)
soup = BeautifulSoup(page.read(), 'html.parser')

for row in soup.findAll('table')[0].tbody.findAll('tr'):
    first_column = row.findAll('th')[0].text
    print first_column

然而,当我尝试从第二列提取相同的数据时:

for row in soup.findAll('table')[0].tbody.findAll('tr'):
    second_column = row.findAll('th')[1].text
    print second_column

I get an error:

ePrix
Traceback (most recent call last):
  File "addon.py", line 9, in <module>
    second_column = row.findAll('th')[1].text
IndexError: list index out of range

我做错了什么?
1个回答

4
这是因为除第一行外的所有行都只包含一个 th 元素:
<tr>
<th>1</th>
<td>...</td>
...
<td>24 October 2015</td>
</tr>

你需要找到每一行中所有的tdth元素,并获取第一个元素:
for row in soup.find_all('table')[0].tbody.find_all('tr')[1:]:
    print(row.find_all('td')[0].text)

[1:]这里是为了跳过第一行表头。

输出:

Beijing ePrix
Putrajaya ePrix
Punta del Este ePrix
Buenos Aires ePrix
Mexico
Long Beach ePrix
Paris ePrix
Berlin ePrix
Moscow ePrix
London ePrix Race 1
London ePrix Race 2

这可能是一个愚蠢的问题,但如果我想从第二列以外的另一列获取信息怎么办?那我该怎么做? - user4962385
1
@LucEvertzen 当然,可以尝试使用索引进行操作:print(row.find_all('td')[1].text)print(row.find_all('td')[2].text)等。 - alecxe
我尝试了这个,但出现了“列表索引超出范围”的错误。编辑:我弄清楚了,我目前正在尝试将其应用于不同的表格,该表格具有不同的结构。我会再试一下的。 - user4962385
1
@LucEvertzen 嗯,这是因为表格中合并单元格导致的。最后一行只有 2 个 td,而不是 3 个。我想你可以提出一个关于如何处理它的独立后续问题。请确保提供所有详细信息。谢谢。 - alecxe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接