You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:52:31