如何基于关键词从XML中提取指定汽车数据?
提取XML中Honda车型指定字段的解决方案
问题描述
我有一份汽车数据XML文件,想要提取其中包含“Honda”关键词的条目,并且只获取Car_id、Car Name、Price at location 98134、Mpg这几个字段。用Python的xml.etree.ElementTree写了代码,但得不到预期结果,刚接触Python和XML,求帮忙修正代码。
XML示例数据
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> <Catalog> <CatalogItemLine> <NameValue name="Car_id">111-2020-3</NameValue> <NameValue name="Car Name">Honda Accord</NameValue> <NameValue name="Price at location 98134">40000</NameValue> <NameValue name="type">Gas</NameValue> <NameValue name="Mpg">30</NameValue> <NameValue name="color">blue</NameValue> <NameValue name="door">4</NameValue> </CatalogItemLine> <CatalogItemLine> <NameValue name="Car_id">121-2020-3</NameValue> <NameValue name="Car Name">Honda Civic</NameValue> <NameValue name="Price at location 98134">30000</NameValue> <NameValue name="type">Gas</NameValue> <NameValue name="Mpg">35</NameValue> <NameValue name="color">white</NameValue> <NameValue name="door">2</NameValue> </CatalogItemLine> <CatalogItemLine> <NameValue name="Car_id">131-2020-3</NameValue> <NameValue name="Car Name">Toyota Camry</NameValue> <NameValue name="Price at location 98134">45000</NameValue> <NameValue name="type">Gas</NameValue> <NameValue name="Mpg">32</NameValue> <NameValue name="color">black</NameValue> <NameValue name="door">4</NameValue> </CatalogItemLine> <CatalogItemLine> <NameValue name="Car_id">151-2020-3</NameValue> <NameValue name="Car Name">Honda Pilot</NameValue> <NameValue name="Price at location 98134">50000</NameValue> <NameValue name="type">Gas</NameValue> <NameValue name="Mpg">30</NameValue> <NameValue name="color">gray</NameValue> <NameValue name="door">4</NameValue> </CatalogItemLine> <CatalogItemLine> <NameValue name="Car_id">101-2020-3</NameValue> <NameValue name="Car Name">Chevy Malibu</NameValue> <NameValue name="Price at location 98134">40000</NameValue> <NameValue name="type">Gas</NameValue> <NameValue name="Mpg">30</NameValue> <NameValue name="color">white</NameValue> <NameValue name="door">4</NameValue> </CatalogItemLine> </Catalog>
预期输出
Car_id 111-2020-3 Car Name Honda Accord Price at location 98134 40000 Mpg 30 Car_id 121-2020-3 Car Name Honda Civic Price at location 98134 30000 Mpg 35 Car_id 151-2020-3 Car Name Honda Pilot Price at location 98134 50000 Mpg 30
现有代码问题分析
你写的代码存在几个问题:
- 缩进错误:
for循环前多了缩进,会触发语法错误 - 判断逻辑偏差:
CatalogItemLine.find('NameValue')只会匹配第一个NameValue节点,无法定位到“Car Name”字段,没法准确判断是否包含“Honda” - 输出不符合要求:仅打印了单个节点文本,没有提取指定的四个字段内容
修正后的代码
import xml.etree.ElementTree as ET xmlfile = 'cardata.xml' tree = ET.parse(xmlfile) root = tree.getroot() # 定义需要提取的目标字段 target_fields = ['Car_id', 'Car Name', 'Price at location 98134', 'Mpg'] for item in root.findall('.//CatalogItemLine'): # 先获取当前条目的Car Name值,判断是否为Honda车型 car_name = None for nv in item.findall('NameValue'): if nv.get('name') == 'Car Name' and nv.text: car_name = nv.text break if car_name and 'Honda' in car_name: # 遍历目标字段,提取并打印对应内容 for field in target_fields: for nv in item.findall('NameValue'): if nv.get('name') == field and nv.text: print(field) print(nv.text) break # 条目之间空行分隔 print()
代码说明
- 先定义
target_fields列表,明确要提取的字段范围 - 遍历每个
CatalogItemLine条目,优先定位“Car Name”字段,判断是否包含“Honda”关键词 - 确认是Honda车型后,逐个匹配目标字段,打印字段名和对应文本内容
- 每个条目输出结束后打印空行,和预期输出格式保持一致
内容的提问来源于stack exchange,提问作者iced
相关产品推荐
相关产品推荐

