只能访问具有负索引的某些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抛出索引超出范围的异常。此外,当我归档.write(str(rows))时,我得到的html与测试文档的html完全匹配。

总之,我可以访问整个列表,但我想了解为什么我会遇到这个奇怪的异常。

对不起,伙计们,答案是我是个白痴。标记中有一个不一致的表,该表较短,正在引发异常。一次运行一个循环表明len!=每次迭代4次,对错误信息表示歉意。既然这个问题不正确,就把它删掉是不是形式不好?

您永远不应该为未知大小的列表编制索引。永远不要相信标记总是正确的。

根据我使用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文档,了解.find_all()的更多选项,这些选项可能对您的用例有所帮助。例如,如果只得到第4个元素,请使用limit=4作为关键字参数。

最新更新