【发布时间】:2012-03-06 22:00:12
【问题描述】:
我正在使用 BeautifulSoup4 解析文档,但出现了一些奇怪的行为,相关的代码如下所示:
for sale_table in sales_soup.find_all('table'):
rows = sale_table.find_all('tr')
grantor = rows[3]
但是,这给了我一个超出范围异常的索引。因此,我在授予人分配之前和之后立即运行了一些基本检查和 len(rows) == 4 (使用不会引发异常的索引)。我还可以使用 rows[0] 和 rows[1] 访问行的第一个和第二个元素。但是,我只能使用 rows[-1] 和 rows[-2] 访问元素 3 和 4,尝试使用索引 2 或 3 或 -3 或 -4 会引发索引超出范围异常。此外,当我 file.write(str(rows)) 和我得到的 html 与测试文档的 html 完全匹配时。
总而言之,我可以访问整个列表,但我想了解为什么会出现这个奇怪的异常。
对不起,伙计们,答案是我是个白痴。标记中存在一个不一致的表,该表较短并引发异常。一次运行一个循环显示每次迭代 len != 4 对错误信息表示抱歉。因为这个问题不正确,所以编辑这个问题是不好的形式吗?
【问题讨论】:
-
除了,AFAIR,
find_all不返回列表,它返回一些 BS 对象。所以,可能是 BS4 中的一个错误。 -
@CatPlusPlus:我知道你不喜欢它,但称它为 BS 对象是不是太过分了? :)
-
您能否在
find_all之后提供row内容的转储? -
@EduardoIvanec:嘿,我不会一遍又一遍地拼写 BeautifulSoup。尤其是我总是无法在第一时间获得“美丽”。 :P
-
试试
rows = list(sale_table.find_all('tr'))。你能排除rows[-1] == rows[1],所以它实际上只有两个元素吗?无法访问rows[-2]与此一致。
标签: python beautifulsoup