python檢查HTML的標籤完整性

2021-06-12 12:48:03 字數 4321 閱讀 6443

工作中遇到解析html的問題,因為對html的完整性要求較高,雖然beautifulsoup也有自動對html進行檢查修復,但位置好像不怎麼準確,因為此方面經驗有限,沒有找到相應的辦法,自己實現了一段**,用於檢查html的標籤完整性,**如下:

#coding:utf-8

'''created on 2013-1-28

html**補全

"***"正常

""正常

"***"異常-沒有關閉標籤

"***"異常-沒有開始標籤

@author: bean

'''import re

html = '''

*********************

'''def check(html):

tagstack =

tagdict = {}

m = re.compile('<[^>,^<]*>')

alltags = m.findall(html)

for index, tag in enumerate(alltags):

if judgevalid(tag):

tagname = gettagname(tag)

if tagname[0] != '/':#是前標籤

elif tagname[0] == '/':#是閉合標籤

if cmp(tagstack[len(tagstack)-1],getclosetagname(tagname)) == 0:

tagstack.pop()

else :

tagclosestack = gettagclosestack(index, alltags)

stackindex = judgestack(tagstack, tagclosestack)

print index,tagname, tagstack, stackindex

if stackindex :

#關閉標籤丟失

tmpclosetag = ''

for i in xrange(stackindex) :

tmptag = tagstack.pop()

tmpclosetag += ''%tmptag

puttagdict(index, tmpclosetag, tagdict, 1)

tagstack.pop()

else :

#沒有開標籤

puttagdict(index-1, '<%s>'%getclosetagname(tagname), tagdict, 0)

#print index,tag

print tagdict

return tagdict

''' #返回標籤棧與關閉標籤棧首對應的位置

#如果大於0,對應數量的關閉標籤丟失

#如果等於0當前關閉標籤的開始標籤丟失

'''

def judgestack(tagstack, tagclosestack):

j = 0

tmpi = 0

for i,tmptagname in enumerate(tagstack[::-1]):

if cmp(tmptagname, getclosetagname(tagclosestack[j])) == 0 :

if j == 0 :

tmpi = i

if j == len(tagclosestack)-1 :

return tmpi

if i == len(tagstack)-1 :

return tmpi

j += 1

else :

if j > 0 :

if cmp(tmptagname, getclosetagname(tagclosestack[0])) == 0 :

j =1

tmpi = i

else :

j = 0

tmpi = 0

return 0

'''得到關閉標籤的名字'''

def getclosetagname(closetagname):

return closetagname[1:len(closetagname)]

'''得到關閉標籤的棧'''

def gettagclosestack(index,alltags):

tagclosestack = [gettagname(alltags[index])]

i=1while true:

if index+i < len(alltags):

tmptagname = gettagname(alltags[index+i])

if tmptagname[0] == '/':

i += 1

else :

return tagclosestack

else :

return tagclosestack

''' #存入標籤字典

#static 1:缺少關閉標籤,0:缺少開始標籤

'''def puttagdict(index, tag, tagdict, static):

if index in tagdict :

if static in tagdict[index]:

if static :

tagdict[index][static] += tagdict[index][static] + tag

else :

tagdict[index][static] += + tag + tagdict[index][static]

else :

tagdict[index][static] = tag

else :

tagdict[index] = {}

tagdict[index][static] = tag

'''是否是有效的標籤'''

def judgevalid(tag):

if cmp(tag[1], '!') == 0:

return false

if cmp(tag[len(tag)-2], '/') == 0:

return false

return true

'''得到標籤名'''

def gettagname(tag):

return tag[1:len(tag)-1].split(' ')[0]

'''找到標籤在檔案中的位置'''

def findtagbefore(number, html):

m = re.compile('<[^>,^<]*>')

alltags = m.findall(html)

start = 0

for index, tag in enumerate(alltags) :

tagindex = html.find(tag, start)

start = tagindex + 1

if index == number :

return tagindex

def findtagafter(number,html):

index = findtagbefore(number, html)

return html.find('>', index) + 1

'''在html中插入缺少的標籤'''

def insert(original, new, pos):

return original[:pos] + new + original[pos:]

'''修復html'''

def fixhtml(html):

tagdict = check(html)

keys = tagdict.keys()

keys.sort(reverse=true)

for key in keys :

if 1 in tagdict[key] :

index = findtagbefore(key, html)

html = insert(html, tagdict[key][1], index)

if 0 in tagdict[key] :

index = findtagafter(key, html)

html = insert(html, tagdict[key][0], index)

return html

if __name__ == '__main__':

print fixhtml(html)

HTML標籤檢查工具

最近寫頁面,使用各個瀏覽器提示各種不同的錯誤 html1524 無效 doctype。最短的有效文件型別是 一開始自己寫的是 最後修改為 沒有報html1524錯誤了 demo.html,行1 字元1 html1521 不符合要求的 或檔案結尾。在文件結束之前,所有具有開始標記的元素都應正確結束。d...

python去除所有html標籤的方法

這段 可以用於去除文字裡的字串標籤,不包括標籤裡面的內容 import re 程式設計客棧html 程式設計客棧a 程式設計客棧href 我們,python學習!dr re.fezczocmclcompile r re.s dd dr.sub html print dd 執行結果如下 我們,pyth...

中 標籤 HTML中的標籤

講一下html中檔案標籤和文字標籤的使用 目的是學會使用,所以借助工具可以省好多時間 1.檔案標籤 構成html最基本的標籤 html html文件的根標籤 head 頭標籤。用於引入html文件的一些屬性。引入外部的一些資源 title 標題標籤 body 體標籤 html5中定義該文件是html...