IndexError:列表索引超出范围。无法理解问题出在哪里?

Posted

技术标签:

【中文标题】IndexError:列表索引超出范围。无法理解问题出在哪里?【英文标题】:IndexError: list index out of range. Cannot understand where the issue is? 【发布时间】:2020-07-28 05:59:28 【问题描述】:

这是我收到 IndexError 的代码。

# importing the required libraries
import pandas as pd

# Visualisation libraries
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
import folium 
from folium import plugins

# Manipulating the default plot size
plt.rcParams['figure.figsize'] = 10, 12

# Disable warnings 
import warnings
warnings.filterwarnings('ignore')
# for date and time opeations
from datetime import datetime
# for file and folder operations
import os
# for regular expression opeations
import re
# for listing files in a folder
import glob
# for getting web contents
import requests 
# for scraping web contents
from bs4 import BeautifulSoup
# get data

# link at which web data recides
link = 'https://www.mohfw.gov.in/'
# get web data
req = requests.get(link)
# parse web data
soup = BeautifulSoup(req.content, "html.parser")
# find the table
# ==============
# our target table is the last table in the page

# get the table head
# table head may contain the column names, titles, subtitles
thead = soup.find_all('thead')[-1]
# print(thead)

# get all the rows in table head
# it usually have only one row, which has the column names
head = thead.find_all('tr')
# print(head)

# get the table tbody
# it contains the contents
tbody = soup.find_all('tbody')[-1]
# print(tbody)

# get all the rows in table body
# each row is each state's entry
body = tbody.find_all('tr')
# print(body)
IndexError

Traceback (most recent call last)
<ipython-input-7-eda41c6e195c> in <module>
     15 # get the table tbody
     16 # it contains the contents
---> 17 tbody = soup.find_all('tbody')[-1]
     18 # print(tbody)
     19 

IndexError: list index out of range

【问题讨论】:

[-1] 这是获取索引-1 的元素,这对于列表没有意义,因此会出现错误。可能这应该是[::-1],这是用于反转列表顺序的切片符号。 您想从站点中提取表格信息? @HymnsForDisco [-1] 索引在 Python 中确实有效——它获取列表中的最后一个元素 :) 实际上它非常有用。 OP 可能出错的地方是列表中没有元素的情况。在这种情况下,没有“最后一个元素”,所以 Python 会抛出错误。 @GrantSchulte 好点。似乎有些时间在更严格的语言中让我忘记了 Python 的一些技巧 在我修复了问题 [:-1] 之后,我在这一行遇到了另一个错误::: body = tbody.find_all('tr') AttributeError: 'list' object has no attribute 'find_all ' 【参考方案1】:

由于列表为空而发生此错误。当不确定列表是否为空时,请进行检查。对于列表 l:-

if len(l) != 0:
    k = l[-1]
else:
    k = None

【讨论】:

【参考方案2】:

当您提取表格时,table 中没有 tbody 标记。

当您正确分析网站时,您会发现该网站进行了 ajax 调用以获取表格信息。以下脚本将 json 数据保存到文件中。美妙之处在于您无需传递任何内容即可获取此数据。这总是返回最新的数据。

import requests, json

url = 'https://www.mohfw.gov.in/data/datanew.json'
res = requests.get(url)

with open("data.json", "w") as f:
    json.dump(res.json(), f)

【讨论】:

以上是关于IndexError:列表索引超出范围。无法理解问题出在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

IndexError:数组反转中列表索引超出范围

IndexError:列表索引超出范围(打印整数)

Python:IndexError:列表索引超出范围

csv,IndexError:列表索引超出范围

IndexError:列表索引超出范围(对象检测)

IndexError:列表索引超出范围(Python)