【问题标题】:Beautifulsoup Exception list out of rangeBeautifulsoup 异常列表超出范围
【发布时间】:2023-03-03 00:03:02
【问题描述】:

我正在使用 beautifulsoup 执行以下操作:
section = soup.findAll('tbody')[0]

如果 BS4 找不到 tbody,如何使用第一个列表项设置类似的变量...而不抛出异常:IndexError: list index out of range

有什么想法吗?

【问题讨论】:

  • section = soup.find('tbody')。如果 tbody 不存在,section 将是 None

标签: python list exception python-2.7 beautifulsoup


【解决方案1】:

doc

因为 find_all() 是 Beautiful Soup 搜索 API 中最流行的方法,所以您可以使用它的快捷方式。如果您将 BeautifulSoup 对象或 Tag 对象视为一个函数,那么它与在该对象上调用 find_all() 相同。

所以在你的情况下,我认为你可以这样做:

if soup("tbody"):
    section = soup("tbody")[0]

请注意,在您的代码中,当错误发生时 section 是一个空列表,但您正在尝试获取尚不存在的元素 [0]。在上面的代码中,您首先检查列表是否存在且不为空。如果检查通过,则您可以访问列表的第一个元素。

【讨论】:

    【解决方案2】:

    每个解析 HTML 的人都会遇到这种类型的问题。您要查找的元素位于嵌套结构中... table -> tbody -> tr -> td ... etc...

    但是,您需要记住以下几点:

    (1) 您指定的路径越详细,以找到您的元素。如果您没有正确处理异常,您的代码将更容易中断,实际上,您找到路径的逻辑可能根本不通用..

    (2)尽量通过唯一的id或者classes来定位元素,而不是依赖一些通用标签的顺序..

    (3) 如果您尝试收集的文本遵循某种模式。您可以使用文本本身轻松找到它,这对程序员来说更直接......文本是人们实际看到的。

    import re
    ...
    print soup.find_all(text=re.compile("pattern"))
    # then you can find the element by calling parent of the found texts.
    

    简而言之,在我看来,永远不要搜索“tbody”标签...因为代码总是这样:

    <table..>
        <tbody>
            <tr>
            ...
        </tbody>
    <table>
    

    如果你已经找到了表,你可以这样做

    table = soup.find('table'...)
    # unless you are trying to not recursively find tr, then you have to find tobody first and find_all(recursive=FALSE)
    table.find_all('tr')
    

    【讨论】:

      【解决方案3】:

      您可以从findAll 返回答案并首先检查它的长度:

      x = soup.findAll("tbody")
      
      if x is not None and len(x) > 0:
          section = x[0]
      

      【讨论】:

      • 由于find_all 返回一个空列表,None 和长度检查是多余的......if x: 就足够了 - (甚至可能单行到section = x[0] if x else 'Empty'
      • 谢谢!我必须检查元素是否存在,否则在访问第 0 个元素时索引超出范围
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 2014-03-06
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      相关资源
      最近更新 更多