Beautifulsoup例外列表超出范围

时间:2013-10-27 12:41:20

标签: python list exception python-2.7 beautifulsoup

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

如何使用第一个列表项设置变量...如果BS4无法找到tbody,如果没有抛出异常:IndexError: list index out of range

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您可以从findAll返回答案,并先检查其长度:

x = soup.findAll("tbody")

if x is not None and len(x) > 0:
    section = x[0]

答案 1 :(得分:3)

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

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

(1)您指定查找元素的路径的详细信息越多。如果你没有正确处理异常,你的代码就会越容易破解,实际上,你找到路径的逻辑可能根本不是通用的。

(2)尝试通过唯一的id或类来定位元素,而不是依赖于某些常规标签的顺序..

(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')

答案 2 :(得分:2)

doc

  

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

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

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

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