我正在抓取网页,并将输出内容写入.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
任何帮助将不胜感激。
答案 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列,因为那是您计算的第一行的内容,但是您可以将其更改为应有的行。