我正在开展一个项目,要求我扫描大量的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(", ")
这不起作用。我也尝试将此表示为功能但没有运气。
所以我转向你。我想要做的是如果有任何内容,将内容拆分为逗号。如果没有,脚本应该通过。
我非常感谢任何帮助!
答案 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
测试对象标识,如上所示。