diff --git a/main/parse_html.py b/main/parse_html.py new file mode 100644 index 0000000..ca9d4a9 --- /dev/null +++ b/main/parse_html.py @@ -0,0 +1,979 @@ +from lxml import html,etree + +from init import gcfg +import json + + +#自动生成跟目录和引导页 +def parse_html_to_ppt(html_string): + """ +
三级 + + slide type: + main -- 封面 + text + img + table + chart + guide --引导页
]*>.*?', replace, html_str, flags=re.DOTALL | re.I)
+ return protected, code_blocks
+
+#转换html成中间格式,方便wangeditor编辑
+def trans_html_to_format(html_string):
+ """
+ WangEditor的缺陷:
+
+ 包含表格则移除 + blockquote_remove = False + + for event,element in context: + if event == 'start': #开始解析 + #第一个元素 + if not first_element: + first_element = element.text + + #节点元素分析 + if element.tag =="hr": #提升hr为h2单独的一个页面 + next_item = element.getnext() + if hr_count >=2: ##多调线,不是海报 + if next_item is not None and next_item.tag in ["h3","h4","h5"]: #直接升h2 + h3_h5_to_h2=True + continue + else: + b_element=f"
0x{index:02d}{all_text}" + #h3_h5_to_h2=False + content.append(b_element) + continue + elif h4_to_h3 and element.tag=="h4": + b_element=f"{all_text}
" + content.append(b_element) + continue + elif element.getparent().tag=="li": #直接降级为p + b_element=f"{all_text}
" + content.append(b_element) + continue + else: + b_element = f'<{element.tag}' + elif element.tag in ["ol","ul"]: #处理嵌套的ol和ul + if ol_ul_muli: + print(f"处理嵌套{li_level+1}级") + li_level +=1 + if li_level==2: #二级保留ul或ol + content.append("") #提前闭合一级 + h5_close = True + b_element = f'<{element.tag}' + else: + #其它全部忽略 + continue + else: + #首次判断,是否嵌套 + ol_s = element.xpath(".//ol") + ul_s = element.xpath(".//ul") + if len(ol_s) >0 or len(ul_s) >0: + ol_ul_muli = True + li_level +=1 + print(f"存在嵌套情况ol:{len(ol_s)}, ul:{len(ul_s)},开启1级嵌套处理,忽略ul或ol") + continue + else:# 不嵌套 + b_element = f'<{element.tag}' + + elif element.tag=="li": #升级处理 + if ol_ul_muli and li_level==1: + b_element = f'=3: + b_element = f'
{table_close_ul}>") #提前闭合一级 + table_close = True + #正常处理表格 + b_element = f'<{element.tag}' + elif element.tag=="blockquote": + elements_with_any_table = element.xpath('//*[.//table]') + if len(elements_with_any_table) >0: + blockquote_remove = True + continue + else: + b_element = f'<{element.tag}' + else: + if element.tag=="h1": + has_h1=True + b_element = f'<{element.tag}' + + #保留属性 + if element.attrib: + for k,v in element.attrib.items(): + b_element += f' {k}="{v}"' + #文字内容 + if element.text: + b_element += f'> {element.text}' + else: + b_element += '>' + + content.append(b_element) + + #结束解析 + elif event == 'end': #结束解析 + if element.tag !='hr': + + if element.tag=="code" and element.tail: #code之后的内容 + content.append(element.tail) + continue + elif element.tag in ["h3","h4","h5"]: + if h3_h5_to_h2:#全面升级为h2 + h3_h5_to_h2=False + continue + elif element.getparent().tag=="li": #直接降级为p + continue + elif h4_to_h3 and element.tag=="h4": + continue + else: + tag = element.tag + elif ol_ul_muli and element.tag in ["ol","ul"]: + print(f"结束嵌套{li_level}级") + if li_level==2: #保留 + tag = element.tag + li_level -=1 + else: + if li_level==1: #结束 + ol_ul_muli = False + li_level -=1 + continue + elif ol_ul_muli and element.tag =="li": #处理嵌套的ol和ul的结束标记 + if li_level >=3: + tag = 'i' + elif li_level ==2: + tag = element.tag + elif li_level ==1 and h5_close: #提前闭合不予处理 + h5_close = False + continue + elif li_level ==1: + tag = "h5" + elif element.tag=="table" and table_close: + content.append(f"
您的问题聚焦于 XML/HTML 解析中标签开始(start)和标签结束(end)的遍历方式,这在 Python 的 lxml 库中通常通过 iterparse 实现。以下是针对此场景的清晰解答:
lxml.etree.iterparse 的 events 参数lxml 提供了 iterparse 方法,支持在解析过程中捕获 标签开始(start) 和 标签结束(end) 的事件。这是处理大文件或流式解析的高效方式,避免一次性加载整个文档。
from lxml import etree
+
+# 示例 XML 内容
+xml_content =
+<root>
+ <item id="1">Text1</item>
+ <item id="2">Text2</item>
+</root>
+
+# 关键:设置 events=('start', 'end')
+context = etree.iterparse(
+ io.BytesIO(xml_content.encode()), # 从字符串解析(实际文件用 open('file.xml'))
+ events=('start', 'end') # 捕获标签开始和结束事件
+)
+
+for event, elem in context:
+ if event == 'start':
+ print(f"【开始标签】{elem.tag} (属性: {elem.attrib})")
+ elif event == 'end':
+ print(f"【结束标签】{elem.tag}")
+ elem.clear() # 清理内存,避免内存泄漏(重要!)
+【开始标签】root (属性: {})
+【开始标签】item (属性: {'id': '1'})
+【结束标签】item
+【开始标签】item (属性: {'id': '2'})
+【结束标签】item
+【结束标签】root
+Element 对象的属性(如 element.tag)直接区分开始/结束标签Element 本身没有“开始/结束”属性,它是一个已解析的节点,标签的开始/结束是解析过程中的事件。Element 对象的属性。end 事件中操作 elem.text:本次问题与您历史询问的 python lxml 中 element 都有哪些属性 相关——iterparse 的 events 机制是理解标签解析流程的关键,而 Element 属性(如 tag, attrib, text)是事件处理后的操作对象。
如需进一步验证,可运行上述代码测试。如有其他解析场景,欢迎补充细节! 😊
+ +""" + + html_string2 = """ +根据提供的联网搜索结果,我将为您梳理Gartner对数据安全态势管理(DSPM)的演进过程:
+Gartner在《2021数据安全技术成熟度曲线》报告中首次提出"数据安全平台"(Data Security Platforms, DSP)的概念,为DSPM奠定了基础。该报告定义DSP为"以数据安全为中心的产品和服务,旨在跨数据类型、存储孤岛和生态系统集成数据的独特保护需求"。
+在2022年发布的《2022年数据安全技术成熟度曲线》报告中,Gartner正式提出"数据安全态势管理"(Data Security Posture Management, DSPM)这一新概念,并给出了明确的定义:
+++"DSPM旨在为企业组织提供更加全面的数据安全可见性,以便深入了解敏感数据的位置、访问权限、如何被利用以及如何存储等安全状况态势信息。"
+
这一阶段,DSPM被定位为解决企业数据安全可见性不足问题的关键方案,标志着数据安全技术从传统的边界防护向数据资产视角的转变。
+随着数据安全挑战的演变,Gartner在后续报告中进一步扩展了DSPM的内涵和功能:
+2023年:Gartner关注到市场出现了提供不同安全能力及组合的数据安全平台或数据安全管理平台,开始强调DSPM在跨数据类型、存储孤岛和生态系统中的集成能力。
+2024-2025年:在Gartner发布的《2025年数据安全技术成熟度曲线》报告中,DSPM被列为关键数据安全技术之一,其功能进一步扩展:
+Gartner对DSPM的演进过程体现了数据安全理念从"以网络边界为中心"到"以数据资产为中心"的转变,具体表现为:
+DSPM的演进反映了数据安全技术从被动防御到主动管理、从局部控制到全局态势感知的发展趋势,成为企业数据安全治理的关键组成部分。
+目前,DSPM已成为Gartner数据安全技术成熟度曲线中的核心组成部分,随着数据安全挑战的不断演变,DSPM的功能和应用场景也在持续扩展和深化。
+""" + html_string3=""" +您的问题是关于 XPath 的 // 语法,但问题描述不完整(可能想问“// 在 XPath 中的含义”或“如何在 lxml 中使用 //”)。结合历史对话中您提到的 “lxml python 查找子元素” 和 “lxml python 查找所有子元素”,我来清晰解释:
// 的含义在 XPath 中,// 是 “从根节点递归查找所有匹配节点” 的通配符。它的作用是:
descendant::(后代轴)。| XPath 表达式 | +含义 | +是否匹配嵌套元素 | +
|---|---|---|
//div |
+文档中所有 <div> 元素(无论层级) |
+✅ 是 | +
//div[@class='a'] |
+所有 class="a" 的 <div> |
+✅ 是 | +
div |
+当前节点的直接子元素(不递归) | +❌ 否 | +
./div |
+当前节点的直接子元素(与 div 等价) |
+❌ 否 | +
.//div |
+当前节点的后代元素(递归查找) | +✅ 是 | +
++💡 关键区分:
++
+- 您历史问题中的 “查找子元素” 通常指 直接子元素(用
+div或./div)。- 您历史问题中的 “查找所有子元素” 实际应为 “查找所有后代元素”(用
+//div),因为 XPath 中没有“所有子元素”的概念(子元素仅指直接子级)。
假设您用 lxml 解析 HTML/XML,以下是常见用法:
//)from lxml import etree
+
+html = '''
+<html>
+ <body>
+ <div class="outer">
+ <div class="inner">Hello</div> <!-- 嵌套在 div.outer 内 -->
+ </div>
+ </body>
+</html>
+'''
+
+tree = etree.HTML(html)
+
+# 查找所有 <div> 元素(包括嵌套的)
+all_divs = tree.xpath('//div')
+print([elem.get('class') for elem in all_divs])
+# 输出: ['outer', 'inner'] # 包含了所有层级的 div
+
+div 或 ./div)# 查找 body 的直接子元素(仅 body 下的第一层)
+direct_children = tree.xpath('/html/body/div')
+print([elem.get('class') for elem in direct_children])
+# 输出: ['outer'] # 仅匹配 body 下的直接 div(不匹配 inner)
+
+# 或用相对路径(当前节点 body 的直接子 div)
+body = tree.xpath('/html/body')[0]
+direct_children = body.xpath('div') # 注意:这里用 'div' 而非 '//div'
+print([elem.get('class') for elem in direct_children])
+# 输出: ['outer'] # 仅匹配 body 的直接子 div
+
+//div 会被误认为“查找所有子元素” → 实际是查找所有后代元素(包括嵌套)。div 或 ./div(不带 //)。| 您的历史问题 | +正确 XPath 方案 | +说明 | +
|---|---|---|
| “查找子元素”(直接子级) | +div 或 ./div |
+仅当前节点的子元素,不递归 | +
| “查找所有子元素”(实际应为“所有后代”) | +//div |
+递归查找所有层级的 div | +
如果需要进一步验证或具体场景的代码示例,请补充您的 HTML 结构或明确需求,我会提供针对性解答! 😊
+""" + html_string4=""" +《中华人民共和国数据安全法》(以下简称《数据安全法》)于2021年9月1日起正式施行,是我国首部在数据安全领域的基础性、综合性法律,旨在应对日益复杂的数据安全风险,维护国家安全、公共利益及个人与组织的合法权益。以下是该法的核心要点总结:
+《数据安全法》要求对数据的收集、存储、使用、加工、传输、提供、公开、销毁等各个环节落实安全保护义务,强调:
+| 维度 | +核心要点 | +
|---|---|
| 定位 | +国家数据安全的“基本法”、“纲领性法律” | +
| 核心理念 | +安全与发展并重,以安全保发展,以发展促安全 | +
| 关键制度 | +分类分级、风险评估、监测预警、应急处置、安全审查、跨境监管 | +
| 执法重点 | +国家核心数据、重要数据、跨境数据流动、重大数据安全事件 | +
++📌 提示:随着2025年数据要素市场化改革加速推进,企业需高度重视数据合规体系建设,特别是数据分类分级、数据出境评估、数据安全审计等方面,避免因违规导致高额处罚。
+
如需了解《数据安全法》全文、实施细则或企业合规建议,可进一步提问。
+ + +""" + + html_string5=""" +作为产品文档质量检查改进QA专家,我已对上传的《百度智能可信数据空间方案》(2025.06版)进行系统化检查。检查依据为:
+经逐项核验,检查结果如下(扣分累计:28分,当前得分:72分)。以下按检查逻辑分步说明。
+| 问题方面 | +扣分 | +理由说明 | +
|---|---|---|
| 客户画像 | +10分 | +文档未明确描述目标客户群体特征(如行业、规模、痛点等)。现有内容仅在“可信数据空间的五种应用场景”中隐含场景类型(如个人、企业、城市),但无系统化客户画像定义,无法体现“谁是我们的客户”及“客户画像”维度。 | +
| 竞品分析 | +10分 | +文档未涉及竞品对比、竞品优劣势分析或市场定位。现有内容仅提政策趋势(如国家数据局计划),但无竞品(如阿里云可信数据空间、腾讯可信数据平台等)的横向分析。 | +
++扣分依据:规则1要求8个方面均需存在,缺失2个方面,按“每少一个方面扣10分”计20分。
+
| 问题方面 | +扣分 | +理由说明 | +
|---|---|---|
| 产品功能 | +3分 | +产品功能描述中存在口语化表达:“支持不同来源数据资源、产品和服务在可信数据空间的统一发布、高效查询、跨主体互认”(“支持”一词重复使用,且“高效查询”表述模糊,未量化标准)。 | +
++扣分依据:规则2要求“语言简明、表达精准、减少口语化”,此句未体现精准性(“高效”缺乏技术定义),扣3分。
+
| 问题方面 | +扣分 | +理由说明 | +
|---|---|---|
| 需求背景 | +2分 | +政策趋势描述较笼统,缺乏对“为什么需要可信数据空间”的深度剖析。例如,仅引用数据占比(42.8%)但未关联当前市场缺口(如数据孤岛导致的经济损失案例),用户难以理解需求紧迫性。 | +
++扣分依据:规则3要求“阐述清晰、有专业深度又能让用户明白”,此部分未结合实证数据说明需求痛点,专业深度不足,扣2分。
+
++注:其他方面(客户画像、竞品分析等缺失部分)不适用规则2/3的扣分,因内容不存在。
+
针对上述问题,提出具体可落地的改进方案,确保文档质量提升:
+客户画像:
+++客户画像
++
+- 政府/公共部门:省级数据局、城市政务平台,核心需求为“跨域数据安全共享”(如某省会城市案例中,需打通50+委办局数据);
+- 行业龙头企业:如电子信息、汽车制造企业,痛点为“供应链数据协同低效”(案例:代工企业质量数据共享赋能90亿元产值);
+- 中小企业:需通过数据授权获取信用增值(如1650+企业融资40亿元)。
+
目标:清晰定义客户群体、典型特征及核心诉求,避免“场景”描述与“画像”混淆。
竞品分析:
+| 竞品 | +核心技术 | +适用场景 | +优势 | +劣势 | +
|---|---|---|---|---|
| 阿里云可信数据空间 | +隐私计算+区块链 | +金融风控 | +服务覆盖广 | +跨境场景支持弱 | +
| 腾讯可信数据平台 | +联邦学习 | +医疗数据共享 | +高性能计算 | +政务合规性待提升 | +
| 百度智能可信数据空间 | +大模型+数据胶囊 | +全场景(含跨境) | +价值共创能力突出 | +企业落地案例较少 | +
++目标:用数据对比凸显百度方案差异化,避免竞品分析流于口号。
+
++理由:删除口语化词“支持”,用“毫秒级”“100+”量化“高效”,提升精准度。
+
++“据《中国数字经济发展研究报告(2024)》,数据孤岛导致企业数据利用率不足35%,年损失超2000亿元。百度方案直击此痛点——通过可信数据空间,可将数据流通效率提升90%(如某电子信息企业案例),推动数据要素价值释放从‘不敢用’转向‘愿用、能用’。”
+
目标:用具体损失数据链接政策趋势与用户价值,避免空泛表述。
本次检查发现文档核心问题为缺失客户画像和竞品分析两个关键维度(扣20分),其次在产品功能语言简明性及需求背景深度上存在不足(扣5分)。当前总分72分,需优先补全客户画像与竞品分析章节,同时精炼语言、深化需求论证。
改进后预期:通过新增结构化客户画像、竞品对比表格及量化案例,文档可达到90+分(满足8方面全覆盖、语言精准、专业深度与用户友好)。建议在2周内完成修订,确保方案在客户沟通与投标中更具竞争力。
++ +""" + print(html_string5) + html_string = trans_html_to_format(html_string5) + print("============================================") + print(html_string) + """ + ppt = parse_html_to_ppt(html_string) + for s in ppt: + print("====") + print(s) + """ \ No newline at end of file最终评分:72分(扣28分)
+
下一步行动:请团队重点落实“客户画像”和“竞品分析”章节的补充工作。