Python读取非规范XML文件:遇指定字符串时停止读取的实现方案
解决二进制读取不规范XML并截断到指定标题的方法
既然你是处理不规范XML,还得用二进制模式读取,核心思路就是把二进制数据解码成文本后,逐行(或逐段)检查终止关键词,一旦匹配到就立刻停止读取,只保留前面的内容。下面我用Python给你举几个实用的实现方案:
基础版:逐行读取并检查关键词
先把二进制行解码成字符串,每读一行就检查是否包含目标标题,遇到就终止循环,这样能避免把整个大文件加载到内存里:stop_phrase = "NOTICE TO APPELLANT" extracted_lines = [] # 先尝试utf-8解码,不行就换成latin-1(万能兜底编码) encoding = "utf-8" with open("your_target.xml", "rb") as f: for line_bytes in f: # 忽略解码错误,避免不规范字符导致程序崩溃 line = line_bytes.decode(encoding, errors="ignore") # 检查是否遇到终止标题 if stop_phrase in line: break extracted_lines.append(line) # 把收集到的内容合并成完整文本,用于后续生成摘要 truncated_content = "".join(extracted_lines)进阶版:处理关键词跨行的情况
有时候目标标题可能被拆成两行(比如“NOTICE TO”在一行,“APPELLANT”在下一行),这时候需要缓存上一行的内容,结合当前行一起检查:stop_phrase = "NOTICE TO APPELLANT" extracted_lines = [] encoding = "utf-8" prev_line = "" with open("your_target.xml", "rb") as f: for line_bytes in f: line = line_bytes.decode(encoding, errors="ignore") # 把上一行和当前行拼接起来检查 combined_text = prev_line.strip() + line if stop_phrase in combined_text: # 如果关键词跨行了,只保留到关键词出现前的部分 split_pos = combined_text.index(stop_phrase) extracted_lines.append(combined_text[:split_pos]) break extracted_lines.append(line) prev_line = line truncated_content = "".join(extracted_lines)后续摘要生成:用容错解析库处理不规范XML
拿到截断后的文本后,别用普通XML解析器(会因为格式不规范报错),可以用lxml的容错模式来解析:from lxml import etree # 创建支持修复不规范XML的解析器 parser = etree.XMLParser(recover=True) try: # 把文本转回二进制再解析(lxml要求字节流) root = etree.fromstring(truncated_content.encode(encoding), parser=parser) # 这里根据你的需求提取摘要,比如提取所有<content>标签的文本 summary = "\n".join([elem.text.strip() for elem in root.iter("content") if elem.text]) print(summary) except Exception as e: print(f"解析XML时出错: {e}")
小提醒
- 如果
utf-8解码乱码,直接换成latin-1编码,它能完美保留所有二进制数据,不会丢失内容。 - 要是关键词有大小写差异,可以改成不区分大小写的匹配:
if stop_phrase.lower() in line.lower()。
内容的提问来源于stack exchange,提问作者user9608799
相关产品推荐
相关产品推荐

