我尝试将HTML页面转换为树结构。我已经派生了这个类(我删除了我实际对每个标签所做的事情,因为它不相关):
class PageParser(html.parser.HTMLParser):
def handle_starttag(self, tag, attrs):
print("start "+tag)
def handle_endtag(self, tag):
print("end "+tag)
def handle_startendtag(self, tag, attrs):
print("startend "+tag)
我希望空元素触发handle_startendtag
方法。问题在于,遇到像<meta>
这样的空元素时,只调用handle_starttag
方法。从我的班级观点来看,标签永远不会被关闭:
parser = PageParser()
parser.feed('<div> <meta charset="utf-8"> </div>')
打印:
start div
start meta
end div
我需要知道每个元素何时关闭才能正确创建树。我如何知道标签是否为空元素?
答案 0 :(得分:2)
检查documentation,特别是这个例子:
解析具有一些属性和标题的元素:
>>>parser.feed('<img src="python-logo.png" alt="The Python logo">') Start tag: img attr: ('src', 'python-logo.png') attr: ('alt', 'The Python logo')
我们可以确定这是预期的行为。
最好的建议来自@HenryHeath的评论:使用BeautifulSoup。
如果你不想使用它,你可以解决HTMLParser
的预期行为,如下所示:
创建包含这些元素名称的列表:
void_elements = ['area', 'base', ... , 'wbr']
在handle_starttag
中检查代码是否在void_elements
列表中:
class PageParser(html.parser.HTMLParser):
def handle_starttag(self, tag, attrs):
if tag in void_elements:
# DO what should happen inside handle_startendtag()
print("void element "+tag)
else:
print("start "+tag)