-1

我正在做一个需要我扫描大量 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(", ")

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

但是,如果源文件损坏,则它没有包含文本“标题:”的强标签。因此,在 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(", ")

这没有用。我也尝试将其表达为一个函数,但没有运气。

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

我非常感谢任何帮助!

4

1 回答 1

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对象身份测试,如上所示。

于 2012-04-11T06:59:00.223 回答