如何处理没有结尾斜杠的空HTML元素?

时间:2017-05-09 10:19:24

标签: python html python-3.x parsing html-parsing

我尝试将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

我需要知道每个元素何时关闭才能正确创建树。我如何知道标签是否为空元素?

1 个答案:

答案 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的预期行为,如下所示:

  • 这是每个HTML 5.2 void element
  • 的列表
  • 创建包含这些元素名称的列表:

    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)
    
祝你好运:)