用Python尝试写一个土法X-Path分析器

   今天突发奇想写一个HTML的分析器练练手,把HTML转换成X-Path的结构,关键在于具体的数据结构和标签关系,目前的设想是这样的:
1、找出所有html中的标签(用正则表达式),得到标签列表(tag_lst);
2、在re.findall()之后的列表中,分析嵌套结构
  1)遍历列表
  2)依次查看所有的标签,一旦带有 '<\xxx>' 模式,就开始往回查找之前的开始标签,一旦发现 xxx 相同,就归为同一层级(标签深度)(稍后解决表示的问题)
3、解决表示的问题

一、设想:
法1、得到tag_lst后,将其中所有元素变成一个列表,用于储存与其对应的标签在tag_lst中的index
结果:
法2、或许可以用递归;
结果:

二、具体实现:
1、导入文件:

import re
with open("html.txt", "r") as f:
    content = f.read()
# 先不考虑内存的事情
# 不然可以写 f.readlines(),一行一行的读入文件

2、生成 tag_lst
重点是 正则表达式 的模式写法
(1): 结果只找到了最简单的匹配, <…>这样的,没有考虑到 ‘\’的结束标签

 r'<[a-zA-Z]+?>'

(2)如下可以找到结束标签了

r''
# /? 表示 有1个或0个/

(3)如下写法可以找到所有的div下带有属性的标签

r'' 
# (注意最后的那个 '?' ,如果不写,就会匹配尽可能多的结果;加了问号就会匹配尽量短的结果)

(4)又发现问题:

http://edu.51cto.com/course/course_id-308...

出现了这样的匹配,还是不太合适

于是最后……..查了资料,答案嘛。。。

.

.

.

.

.

.

.

.

.

.

.

.

.

看了书里的写法之后我表示我二了

r'<[^<]+?>'
# 在《正则表达式经典实例》里找到的,真是笨死
# 这个写法在大部分的情况下都是好用的,后面还有很多挑错的办法,既然咱们重点在于解析,就先凑合用着

于是现在代码是这样

import re
from os import system, popen

# remove result.txt
system("del result.txt")

with open("html.txt", "r") as f:
    content = f.read()
content = content.replace("\n", "")

# brkt_mode = re.compile(r'/]/w+>')
brkt_mode = re.compile(r'<[^<]+?>')
find_text = brkt_mode.findall(content)
##print find_text

# write into result.txt 查看搜出来的tags
with open("result.txt", "w+") as record_f:
    for i in find_text:
        record_f.writelines(i)
        record_f.writelines("\n")

3、寻找嵌套关系
现在所有的标签搜出来了,就要开始重头戏了,查找嵌套关系
先用笨方法,遍历tag_lst,用一次识别去除独立闭合的标签,将其变成内容
设一个变量depth,如果遍历到<>标签,则 depth += 1
如果遍历到

你可能感兴趣的:(python,html,python,html)