使用lxml解析XML文件遇错:需过滤并提取指定字段
解决方案:过滤XML节点并提取指定字段
一、排查lxml解析报错的常见原因
- 确认XML文件编码与解析时指定的编码一致(常见为UTF-8或ISO-8859-1)
- 检查XML是否存在语法错误,比如未闭合标签、非法字符等(你提供的示例XML语法是完整的,若为本地文件需确认无不可见乱码)
- 确保lxml版本为最新,执行
pip install --upgrade lxml更新
二、完整实现代码
先安装依赖(未安装时执行):
pip install lxml
方式1:从字符串加载XML处理
from lxml import etree # 你的XML内容 xml_str = """<risposta> <r><f>81</f><s>AAA</s><m>045567017</m><q>0</q><c>0,000</c><d>Articolo Non Disponibile</d> </r> <r><f>4</f><s>BBB</s><m>045567017</m><q>1</q><c>29,830</c><d></d></r> <r><f>2</f><s>CCC</s><m>045567017</m><q>0</q><c>0,000</c><d>E:</d></r> <r><f>1115</f><s>DDD</s><m>045567017</m><q>1</q><c>30,130</c><d></d></r> <r><f>57</f><s>EEE</s><m>045567017</m><q>0</q><c>0,000</c><d>E:Non trattato</d></r> <r><f>1952</f><s>FFF</s><m>045567017</m><q>1</q><c>29,840</c><d></d></r> <r><f>1737</f><s>GGG</s><m>045567017</m><q>0</q><c>0,000</c><d>B:Sprovvisto</d></r> <r><f>3</f><s>HHH</s><m>045567017</m><q>1</q><c>30,130</c><d></d></r> <r><f>5</f><s>III</s><m>045567017</m><q>0</q><c>0,000</c><d>B:SPROVVISTI</d></r> </risposta>""" # 解析XML root = etree.fromstring(xml_str) # 过滤出<c>值不为0,000的<r>节点 valid_nodes = root.xpath("//r[c != '0,000']") # 提取<s>字段内容 s_values = [node.find('s').text for node in valid_nodes] # 保存到文件 with open('s_fields.txt', 'w', encoding='utf-8') as f: for val in s_values: f.write(f"{val}\n") print("处理完成,结果已写入s_fields.txt")
方式2:从本地XML文件加载处理
如果你的XML是本地文件,替换上述解析部分为:
# 指定编码(根据文件实际编码调整,比如iso-8859-1) parser = etree.XMLParser(encoding='utf-8') tree = etree.parse('your_xml_file.xml', parser) root = tree.getroot()
三、代码说明
- 用XPath表达式
//r[c != '0,000']直接过滤符合条件的节点,高效简洁 - 通过
find('s').text精准提取字段的文本内容 - 保存文件时指定UTF-8编码,避免出现乱码问题
内容的提问来源于stack exchange,提问作者Michele Rizzato
相关产品推荐
相关产品推荐

