我正在使用beautifulsoup来执行以下操作:
section = soup.findAll('tbody')[0]
如何使用第一个列表项设置变量...如果BS4无法找到tbody,如果没有抛出异常:IndexError: list index out of range
?
有什么想法吗?
答案 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]。在上面的代码中,您首先检查列表是否存在且不为空。如果检查通过,那么您可以访问列表的第一个元素。