如何修复“我们范围的索引列表”

2024-09-25 02:37:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在抓取一个网页,并将输出写入.csv。我得到一个“列表索引超出范围”错误。我想我明白这个错误的意思,但我不知道如何改正它。你知道吗

包含我要迭代的容器的HTML代码如下所示:

<tr class="featured even" role="row"><td class="sorting_1 dcLogo">
    <a href="company/company">
    <img src="URL" alt="Company Name" width="50">
    </a>
    </td><td class="dcCompanyName"><a href="URL">Company Name</a></td><td class="dcBoothLabel">9999</td><td class="dcCategories">Widget 1, Widget 2, Widget 3</td><td class="dcCityState">CITY, STATE<br/></td><td class="dcCountry">US</td><td style="visibility:hidden;display:none;">4</td></tr>

我的代码如下所示:


page_soup = soup(page_html, "html.parser")

containers = page_soup.findAll('tr')
del containers[8]

company_names = []
booth_numbers = []
categories = []
countries = []

print("generating csv")
with open('CompanyList.csv','w') as f:
    csv_out = csv.writer(f)
    csv_out.writerow(["company_name", "booth_number", "category", "country"])
    for container in containers:
            cols = container.findAll("td")
            company_name = cols[1].find("a").text
            booth_number = cols[2].text
            category = cols[3].text.strip()
            country = cols[5].text

            company_names.append(company_name)
            booth_numbers.append(booth_number)
            categories.append(category)
            countries.append(country)

            csv_out.writerow([company_name, booth_number, category, country])

f.close
print('Done Writing to File')

运行此操作时,出现“IndexError:list index out of range”错误,指向:

booth_number = cols[3].text

任何帮助都将不胜感激。你知道吗


Tags: csvtextnamenumber错误outcountrytr
3条回答

列没有您假设的那么多。你知道吗

您可以使用len(cols)查看有多少列,并在此基础上,决定当预期的列不存在时要做什么。你知道吗

请注意,在这之后,您将遇到与该行类似的问题。你知道吗

.csv文件中的某些行没有您期望的那么多列。看起来您认为列的数量应该是一致的,所以您只需在实际开始索引行之前进行检查,如下所示:

for container in containers:
    if len(cols) == 7:
        cols = container.findAll("td")
        company_name = cols[1].find("a").text
        booth_number = cols[2].text
        category = cols[3].text.strip()
        country = cols[5].text

        company_names.append(company_name)
        booth_numbers.append(booth_number)
        categories.append(category)
        countries.append(country)

        csv_out.writerow([company_name, booth_number, category, country])

我假设将有7列,因为这是你计算的第一行是什么,但你可以改变它应该是什么。你知道吗

问题是cols数组的长度小于您试图访问的元素。在示例中

booth_number = cols[3].text

cols数组的长度不超过3,因为数组索引是基于零的(元素1的索引为0)。当您试图访问索引为3的第四个元素时,您正在访问范围之外的元素。你知道吗

您可以通过在访问元素之前检查长度来解决此问题。你知道吗

if len(cols) > 3:
     booth_number = cols[3].text

这样,如果展位号不在cols中,您的程序不会失败并停止。你知道吗

相关问题 更多 >