我使用BeautifulSoup4来解析文档并且我得到一些奇怪的行为,相关的代码片段如下所示:
for sale_table in sales_soup.find_all('table'):
rows = sale_table.find_all('tr')
grantor = rows[3]
然而,这给了我一个超出范围异常的索引。所以我在授予者赋值之前和之后立即运行了一些基本检查和len(行)== 4(使用不抛出异常的索引)。此外,我能够访问行[0]和行[1]的行的第一个和第二个元素。但是我只能使用行[-1]和行[-2]访问元素3和4,尝试使用索引2或3或-3或-4抛出索引超出范围异常。此外,当我file.write(str(行))和html我得到的测试文档的html恰好匹配。
总之,我可以访问整个列表,但我想了解为什么我会遇到这个奇怪的例外。
抱歉,答案是我是个白痴。标记中存在一个不一致的表,该表更短并且抛出异常。一次运行一个循环显示每次迭代时len!= 4抱歉错误信息。编辑这个问题是不好的形式,因为它不正确?答案 0 :(得分:0)
您永远不应该索引未知大小的列表。永远不要相信标记是正确的。
根据我对BeautifulSoup的经验,你必须编写很多if语句来自己解决。将上面的代码更改为:
for sale_table in sales_soup.find_all('table'):
rows = sale_table.find_all('tr')
if len(rows) > 3:
grantor = rows[3]
else:
grantor = None
另外,请查看BS4 documentation以获取可能对您的用例有用的.find_all()
的更多选项。例如,如果您只获得第4个元素,请使用limit=4
作为关键字参数。