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

时间:2019-05-30 15:33:51

标签: python web-scraping

我正在抓取网页,并将输出内容写入.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:列表索引超出范围”错误,指向:

booth_number = cols[3].text

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

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

booth_number = cols[3].text

cols数组的长度为3或更短,因为数组索引是从零开始的(元素1的索引为0)。当您尝试访问索引为3的第四个元素时,您正在访问范围之外的元素。

您可以在访问元素之前先检查一下长度,以弥补这一点。

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

那样,如果摊位号不在列中,则程序不会失败并停止。

答案 1 :(得分:0)

您所假设的列不多。

您可以看到len(cols)中有多少列,并以此为基础,确定当此预期列不存在时该怎么做。

请注意,此后的代码行也会出现类似的问题。

答案 2 :(得分:0)

.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列,因为那是您计算的第一行的内容,但是您可以将其更改为应有的行。