我正在了解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))
非常感谢您阅读这篇文章。
答案 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"