索引超出范围但实际上在范围内[关闭]

Posted

技术标签:

【中文标题】索引超出范围但实际上在范围内[关闭]【英文标题】:index out of range but is in fact in range [closed] 【发布时间】:2018-08-30 15:42:14 【问题描述】:

我在使用逗号分隔符从某些文本中拆分出来的列表时遇到问题。

列表有 4-5 个项目,但是当我尝试获取列表中的第 4-5 个项目时,它显示超出范围。不知道为什么会这样。

import re
import requests
r = requests.get('https://halalhmc.org/outlets-by-name/')
from bs4 import BeautifulSoup

soup = BeautifulSoup(r.text, 'html.parser')

results = soup.find_all('div', attrs='class':'outlet-content')

records = []
for result in results:

    name = result.find('h3').text
    fullAddress = result.find('p', attrs='class':'outlet-address').text
    split_address = fullAddress.split(',')
    address1 = split_address[0]
    city = split_address[1]
    city1 = split_address[2]
    validPcode = re.match("[A-Z]2[0-9] [0-9][A-Z]2",split_address[3])
    if validPcode:
        postCode = split_address[3]
    else:
        county = split_address[3]
        postCode = split_address[4]
    records.append((name,address1[10:],city,city1,postCode))

print records[2]

当我打印 len(split_address) 并删除 print records[1] 时,我得到 5 作为长度。

为什么会这样?

【问题讨论】:

什么是完整的错误回溯? html 代码可能有用 我们可以确定的一点是它 is 实际上超出或超出范围,我建议您添加一些打印语句以允许您调试代码,例如 @987654324 @和print(len(split_address)) @DavidG 错误是Traceback (most recent call last): File "HMC.py", line 24, in <module> postCode = split_address[4] IndexError: list index out of range @Dominique 感谢您的洞察力。首先,我是一个刚刚学习如何在 python 中编码的新手。其次,我昨天和今天早上花了一整夜通过谷歌搜索和尝试各种事情来调试问题。第三,为什么 *** 上的一些人如此苛刻?这不是提问和寻求帮助的地方吗? 【参考方案1】:

首先尝试自己调试代码。无论如何,对于您的问题为什么会发生这种情况? :

它在postCode = split_address[4] 中给您错误,因为您的列表有 4 个元素 0、1、2、3,并且您正在访问不存在的第 4 个元素。

你没有 index[4] 这就是为什么它给你的错误超出范围!

更新区域:

在您的 for 循环中,split_address 的长度变为 4 和 5,当长度为 4 并且您尝试获取 index[4] 时,它肯定会给您错误的索引超出范围来解决此问题您必须对其添加检查。

试试这个:

import re
import requests
r = requests.get('https://halalhmc.org/outlets-by-name/')
from bs4 import BeautifulSoup

soup = BeautifulSoup(r.text, 'html.parser')

results = soup.find_all('div', attrs='class':'outlet-content')

records = []
for result in results:

    name = result.find('h3').text
    fullAddress = (result.find('p', attrs='class':'outlet-address')).text
    split_address = fullAddress.split(',')
    address1 = split_address[0]
    city = split_address[1]
    city1 = split_address[2]
    validPcode = re.match("[A-Z]2[0-9] [0-9][A-Z]2",split_address[3])
    if validPcode:
        postCode = split_address[3]
    else:
        county = split_address[3]
        if len(split_address) is 4:
            postCode = split_address[3]
        elif len(split_address) is 3:
            postCode = split_address[4]
    records.append((name,address1[10:],city,city1,postCode))

# only for checking
print records[1]
print records[2]
print records[3]
print records[4]
print records[5]

我稍微修改了您的代码,只添加了一项检查 (split_address)。

希望您能理解并帮助您! :)

【讨论】:

感谢您的解释。在这种情况下,它不存在,但是当我尝试为另一个确实有第 5 项的记录运行相同的代码时,它仍然不起作用。试试print records[1] @Muhammadibn :检查更新的答案!希望对您有所帮助! :) 此外,我认为你必须分裂你的国家。获取邮政编码! 非常感谢。我确实做了re.match,但没有正确地做else 语句。我现在明白了。

以上是关于索引超出范围但实际上在范围内[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我的 Matlab 代码有啥问题?索引超出范围[关闭]

SwiftUI:关闭视图导致索引超出范围错误

SwiftUI:从 ForEach 中删除项目导致索引超出范围

索引超出范围 SwiftUI

Python - 索引错误 - 列表索引超出范围

尺寸超出范围(预计在 [-1, 0] 范围内,但得到 1)(pytorch)