【问题标题】:Encountering ValueError when building a web scraper构建网络爬虫时遇到 ValueError
【发布时间】:2021-09-11 14:46:56
【问题描述】:

我从网站上抓取的列表有 6 个元素,for 循环也考虑了 6 个元素,但是当我尝试执行程序时,我得到一个 ValueError(预期为 6)。这真的让我很困惑,我在我的绳索尽头!希望比我聪明得多的人可以帮助我解决这个问题! 谢谢

import bs4 as bs
import xlsxwriter as xl
y = 0
revenue = 0
row = 0
col = 0
r = requests.get('https://www.moneycontrol.com/financials/britanniaindustries/consolidated-profit-lossVI/BI')
soup = bs.BeautifulSoup(r.content,'lxml')

table = soup.find(class_='mctable1').find_all('tr')[1:]
elem = table
for row in elem:
    y += 1
    cell = [i.text for i in row.find_all('td')]
    if y == 8:
        revenue = cell

# upon printing revenue at this point I get : ['Total Revenue', '13,449.07', '11,878.95', '11,261.12', '10,080.36', '9,204.63', '\xa0']

workbook = xl.Workbook('investment data.xlsx')
worksheet = workbook.add_worksheet()
for head, twentyone, twenty, nineteen, eighteen, rubbish in revenue:
    worksheet.write(row, col, head)
    worksheet.write(row, col + 1, twentyone)
    worksheet.write(row, col + 2, twenty)
    worksheet.write(row, col + 3, nineteen)
    worksheet.write(row, col + 4, eighteen)
    worksheet.write(row, col + 5, rubbish)

workbook.close() ```

【问题讨论】:

  • 只是跳过代码:您确定该收入实际上包含一个列表吗?我明白了,只有在满足某些条件时才会分配 revenue = cell。最简单的解释是,这个条件永远不会满足,并且您尝试访问 revenue = 0 中的 6 个元素
  • @sagre 当我注释掉所有 xlwriter 的东西并在第一个 for 循环之后打印出收入时,我确实得到了一个包含相关信息的列表!所以这一定意味着该列表已正确定义,对吧?
  • 您能否在 for 循环之前使用 revenue 的内容编辑您的帖子?
  • @Sagre 已编辑添加列表!

标签: python excel list web-scraping html-table


【解决方案1】:

我真的不明白你为什么要在这里使用 for 循环?如果您想单独处理列表的每个元素,for 循环将很有用。 for a in list 将 a 分配给列表中的每个元素,第一次迭代时为 Total Revenue:,第二次迭代时为 13,449.07,依此类推。 for a,b in list 假设您的列表包含具有两个元素的列表。然而事实并非如此,因为您有一个简单的列表。

一个在这里会更有用的变体:

for index,entry in enumerate(revenue):
    worksheet.write(row, col + index, entry)

enumerate(list) 为您提供当前索引和列表成员(因此您不需要硬编码 col+1)并且您可以正确地迭代您的收入列表

您尝试做的是在单个 for 循环迭代中访问列表的每个元素。因此,您要么一个接一个地访问每个元素,如上所示,要么删除 for 循环并直接写入工作表:

worksheet.write(row, col, revenue[0])
worksheet.write(row, col + 1, revenue[1])
worksheet.write(row, col + 2, revenue[2])
worksheet.write(row, col + 3, revenue[3])
worksheet.write(row, col + 4, revenue[4])
worksheet.write(row, col + 5, revenue[5])

但是,这会非常非常不雅

【讨论】:

  • 啊,我明白了!我对这整个行业都很陌生,所以 for 循环是我的第一个直觉,但你的想法更有意义!但是,当我尝试在我的代码中使用这个 sn-p 时,我得到了这个错误: TypeError: int() argument must be a string, a bytes-like object or a number, not 'Tag' 我该怎么办? (很抱歉让您为我编写此代码!我只是一个新手,非常感谢您的帮助!)
  • worksheet.write( 的参数可能有问题。您能否将完整的错误消息与更新的代码一起发布,最好作为对您问题的编辑?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2011-12-11
  • 1970-01-01
相关资源
最近更新 更多