如何用xml.etree.ElementTree解析含HTML内容的XML文件
解决方案:将HTML内容提取为单个Token
要解决这个问题,我们需要对原代码做针对性修改——当遇到<LongDescription>标签时,把它内部的所有HTML内容(包括嵌套标签)序列化为一个完整的字符串,作为单个token加入列表,而不是递归拆分每个子标签。
修改后的代码
import xml.etree.ElementTree as ET import re def getTokens(xml_string_file): tokensList = [] tree = ET.parse(xml_string_file) root = tree.getroot() tokensList.append('<component>') for child in root: firstTag = '<' + child.tag + '>' lastTag = '</' + child.tag + '>' tokensList.append(firstTag) # 专门处理LongDescription标签,将内部HTML转为单个token if child.tag == 'LongDescription': # 把该标签下的所有子元素序列化为完整HTML字符串 html_content = ''.join([ET.tostring(elem, encoding='utf-8').decode('utf-8') for elem in child]) tokensList.append(html_content) else: # 其他标签保持原有处理逻辑 if child.text is None: tokensList.append('') elif re.findall(r"\n", child.text, re.DOTALL): tokensList += extractTags(root=child) else: tokensList.append(child.text) tokensList.append(lastTag) tokensList.append('</component>') return tokensList def extractTags(root): tokensList = [] for child in root: firstTag = '<' + child.tag + '>' lastTag = '</' + child.tag + '>' tokensList.append(firstTag) if child.text is None: tokensList.append('') elif re.findall(r"\n", child.text, re.DOTALL): tokensList += extractTags(root=child) else: tokensList.append(child.text) tokensList.append(lastTag) return tokensList
关键修改说明
- 识别特殊标签:在遍历根元素的子节点时,判断当前标签是否为
LongDescription。 - 序列化HTML内容:使用
ET.tostring()方法将LongDescription下的所有子元素(包括嵌套的<html>、<head>、<style>等)转换成完整的字符串,再将这个字符串作为单个token添加到列表中。 - 兼容原有逻辑:其他标签仍按照你原来的递归拆分逻辑处理,不影响原有功能。
效果验证
修改后,你的tokens列表中<LongDescription>对应的token会是完整的HTML内容,例如:
'<html><html> <head> <style type="text/css"> <!-- .style9 { color: #ffff33; background-color: #ff00ff } .style8 { color: #990099; background-color: #66ffcc } ... </style> </head> <body> </body> </html> </html>'
这个完整的HTML字符串会作为一个单独的元素存在于tokens列表中,符合你的需求。
内容的提问来源于stack exchange,提问作者Emna Jaoua
相关产品推荐
相关产品推荐

