检查HTML文档以获取正确的打开和关闭标记

时间:2016-02-03 21:16:23

标签: python python-2.7 python-3.x

我最近在Python中学习了堆栈(我为其创建了一个类),并且我了解到你可以使用它们来检查括号是否平衡,这是每个开始符号都有一个相应的结束符号和一对括号正确嵌套。

现在我正在尝试使用堆栈来执行相同的操作,但使用HTML。例如,我的程序将采用以下文档 -

<html> 
   <head>
     <title>
        Example
     </title>
   </head>

   <body>
      <h1>Hello, world</h1>
   </body>
</html>

并检查它以确保它具有正确的打开和关闭标签。

我甚至不知道从哪里开始,我很困惑。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

如果你想以这种方式解决问题,请考虑一下你之前做过的事情:

您使用了一个堆栈来跟踪([{

(<html>之间的区别是什么?其中一个只是一组角色。因此,更改您的代码 - 而不是读取单个字符并将其放在堆栈上,阅读标记并将其放在堆栈上。

您可能还想确定是否要确保您拥有一些有效的(ish)HTML - 即如果遇到<<html>会发生什么?

答案 1 :(得分:0)

#Old interesting question:use usual stack for pop, push, and peek 
#inserted space for each ">x" and "x<" where x is any char, 
import re
text='''<html>
<head>
<title>
Example
</title>
</head>
<body>
<h1>Hello, world</h1>
</body>
</html>''' 
def check_html_balance(text):
    s=Stack()
    x=text.replace('<', ' <'); y=x.replace('>', '> ')
    a=[w for w in y.split() if re.search('<\S+>',w)]
    b=[w for w in a if "/" not in w]
    c=[w for w in a if "/"  in w]
    for w in text.split():
        if w in b:
            s.push(w)
        elif not s.is_empty() and (w in c) and (w.replace('/','')==s.peek()):                               
            s.pop()
    return s.is_empty()
check_html_balance(text)

答案 2 :(得分:0)

    # A second, shorter solution without replacing "x<" by "x <"...  
    text='''<html>
    <head>
    <title>
    Example
    </title>
    </head>
    <body>
    <h1>Hello, world</h1>
    </body>
    </html>''' 
    import re
    def check_balance(text):
    L=re.split('(<[^>]*>)', text)[1::2]
    s=Stack()
    for word in L:
        if ('/' not in word):
            s.push(word)
        elif not s.is_empty() and (word.replace('/','')==s.peek()):                               
            s.pop()
    return s.is_empty()
check_balance(text)