工作中遇到解析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...