Python中的变量和异常处理 - 它们混合在一起吗?

时间:2012-04-11 06:19:28

标签: python exception-handling beautifulsoup

我正在开展一个项目,要求我扫描大量的HTML文件(8000+)。其中一些文件被破坏,但这是文件来源的必然结果,无法修复。

我选择使用BeautifulSoup4来查找和提取数据。代码如下:

from bs4 import BeautifulSoup

data = open('data\file.html', encoding='utf-8')
soup = BeautifulSoup(data)

tag = soup.find('strong', text="Heading:")

split_tag = str(tag.next_sibling.next_element.next_element).split(", ")

它的作用是打开一个文件,搜索包含文本“标题:”的强标签。然后它以逗号分隔此标记的内容。

但是,如果源文件被破坏,则它没有包含文本“Heading:”的强标记。因此,在split_tag处引发AttributeError,因为它返回“None”,因此没有任何next_sibling。

我尝试使用以下方法解决此问题:

try:
    split_tag = str(tag.next_sibling.next_element.next_element).split(", ")
except AttributeError:
    pass
else:
    split_tag = str(tag.next_sibling.next_element.next_element).split(", ")

这不起作用。我也尝试将此表示为功能但没有运气。

所以我转向你。我想要做的是如果有任何内容,将内容拆分为逗号。如果没有,脚本应该通过。

我非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

以下是重写异常处理程序的方法。如果没有这样的标题,那么我们应该期望得到一个零长度的标签列表。

from bs4 import BeautifulSoup

data = open('data\file.html', encoding='utf-8')
soup = BeautifulSoup(data)

tag = soup.find('strong', text="Heading:")

try:
    split_tag = str(tag.next_sibling.next_element.next_element).split(", ")
except AttributeError:
    split_tag = []  # zero-length list of tags

但在这种情况下,简单的if语句应该可以正常运行,因为soup.find()在找不到任何内容时会返回None

from bs4 import BeautifulSoup

data = open('data\file.html', encoding='utf-8')
soup = BeautifulSoup(data)

tag = soup.find('strong', text="Heading:")

if tag is None:
    split_tag = []
else:
    split_tag = str(tag.next_sibling.next_element.next_element).split(", ")

检查None时,最好使用is测试对象标识,如上所示。