BeautifulSoup4 IndexError:列表索引超出范围?

时间:2018-07-27 12:24:08

标签: python beautifulsoup

我正在了解BS4,无法弄清楚这段代码的作用以及为什么这段代码会抛出这样的错误:

Traceback (most recent call last):
  File "/home/ubuntu/workspace/Untitled1.py", line 17, in <module>
    for tr in soup.find_all('tr')[3]:
IndexError: list index out of range

使用bs4的python代码是:

for tr in soup.find_all('tr')[2]:
    tds = tr.find_all('td')
    print("value:%s,value 2:%s,value3:%s" \
        (tds[0].text,tds[1].text,tds[2].text))

非常感谢您阅读这篇文章。

2 个答案:

答案 0 :(得分:2)

BasicBeautifulSoup是一个python库,可帮助您从HTML和XML文件中提取数据,您所要做的就是仅应用一些规则将数据从Web页面HTML文件中提取。

for tr in soup.find_all('tr')[2]:
    tds = tr.find_all('td')
    print("value:%s,value 2:%s,value3:%s" \
        (tds[0].text,tds[1].text,tds[2].text))

上面的这段代码只是对 soup 变量中的每个'tr'迭代变量应用了一些规则,找到了所有'tr' 标记元素,其索引值为 2 ,然后在for循环中创建了一个 tds 变量,该变量存储每个'tr'的返回值迭代变量,方法是在每个'tr'迭代变量中找到所有'td'标记元素。 然后,代码只是尝试将 3个字符串值打印为试图显示的 value value2 value3 索引0、1和2 tds 变量的文本

但不幸的是,此代码在第17行:for tr in soup.find_all('tr')[2]上引发了 IndexError。 对于您的种类信息,您尝试获取的索引值不在您尝试获取'tr'标签元素的汤变量内部。 因此,它要求您尝试汤变量'tr'标记元素内部提供的其他一些索引值。 这就是为什么错误表示列表索引超出范围的原因。

答案 1 :(得分:0)

要处理这种错误,您可以先测试 list 元素是否存在,然后再使用它,然后再测试 list 是否有 3 个元素:

if soup.find_all('tr'): # test if element exists
    if len(soup.find_all('tr')>2): # if list exists test whether it has more than 2 elements
        for tr in soup.find_all('tr')[2]:
            tds = tr.find_all('td')
            print("value:%s,value 2:%s,value3:%s" \
            (tds[0].text,tds[1].text,tds[2].text))
    else: tds = "tr have less than 3 rows"
else: tds = "tr doesn't exists"