之前写过两篇关于HTML DOM解析的文章(附代码):
第一篇只能识别简单的HTML标签包含,第二篇仅可以分析出一组根叶子节点(Leaf Node),距离简单的标签选择器还有较大的差距。后来想了一两天,结合第二篇PFC020071401里的最小标签对称法,决定放弃完全依赖正则表达式的想法。最终考虑像进行语法分析那样,从HTML文本中,分离出一棵或多颗的语法树,从语法树中找出最终目标。
当前的想法是:
1)分析路径语法;
2)对HTML文本进行正则表达式匹配,找到目标标签;
3)使用最小标签对称法,循环匹配出所有的结果树;
4)判断当前标签是否为最终目标标签,是则利用第3)步结果进行步骤1),否则5);
5)列出结果。
最小标签对称法是利用HTML标签的开始标记和结束标记对称的原理,来完成标签完整性的目标的方法。对于某些个别标签开始和结束标记不完全对称的问题另当别论。HTML5基本要求标签对称。这样就可以忽略正则表达式贪婪匹配带来的“多重包含问题”--标签不完整、包含多个匹配结果。看以下代码最小对称法 minimalpair():
'''
author: MRN6
blog: qq_21264377@blog.csdn.net
updated: Jul. 18th, 2020 Sat. 03:40PM
'''
def minimalpair(tag, html, position):
#最小对称法
check_start_tag='<'+tag
check_end_tag=''
if tag=='meta':
check_end_tag='>'
else:
check_end_tag='</'+tag+'>'
start_tag_length=len(check_start_tag)
end_tag_length=len(check_end_tag)
length=len(html)
index=position
start=html.find(check_start