【问题标题】:Can only access certain BeautifulSoup result elements with negative indices只能访问具有负索引的某些 BeautifulSoup 结果元素
【发布时间】: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


【解决方案1】:

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

根据我使用 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 作为关键字参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多