只能使用负索引访问某些BeautifulSoup结果元素

时间:2012-03-06 22:00:12

标签: python beautifulsoup

我使用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抱歉错误信息。编辑这个问题是不好的形式,因为它不正确?

1 个答案:

答案 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作为关键字参数。