Python3从URL解析XML脚本异常:仅生成根元素无产品数据
解决XML解析与自定义Feed生成问题
看起来你的脚本遇到了两个核心问题:一是生成的XML Feed只有空的<SHOP />根元素,二是只有name被打印出来,后续的产品数据没有被添加到Feed里。我来帮你一步步排查和修复:
1. 先排查min_units_per_order的判断逻辑
首先,你的循环入口是判断min_units_per_order的文本是否为'1',但这里有两个潜在问题:
- 如果
min_units_per_order元素不存在,直接调用.text会抛出AttributeError,导致脚本中断 - 文本可能带有前后空格,或者是数字类型(比如
1而不是字符串'1')
修改判断逻辑,增加元素存在性检查和空格处理:
for r in root.findall('product'): # 先获取元素,再检查文本 min_units_elem = r.find('min_units_per_order') if min_units_elem is not None and min_units_elem.text.strip() == '1': # 后续产品处理代码...
2. 移除异常处理中的continue语句
你的代码在description或PRICE_VAT不存在时,直接用continue跳过了整个产品的处理。这会导致只要这两个元素有一个缺失,该产品就不会被添加到Feed里,同时后续的ean、sku等打印也不会执行。
把continue去掉,只保留默认值赋值:
try: description = r.find('description').text or "" except AttributeError: description = "" # 移除这里的continue try: price = r.find('PRICE_VAT').text or "" except AttributeError: price = "" # 移除这里的continue
3. 为ean元素增加异常处理
你直接调用r.find('barcodes/barcode').text,如果这个元素不存在,会抛出AttributeError,导致脚本中途停止,后续产品都无法处理。给它加上异常处理:
try: ean = r.find('barcodes/barcode').text or "" except AttributeError: ean = "" # 如果ean是必填项,可以在这里加continue跳过该产品,否则保留空值继续 # continue
4. 检查XML命名空间问题(关键排查点)
如果上述修改后还是生成空的Feed,很可能是XML带有命名空间,导致root.findall('product')找不到任何元素。你可以先打印root.tag看看,比如输出可能是{http://some-namespace-url}root,这说明存在命名空间。
处理命名空间的方法有两种:
方法一:显式指定命名空间
# 获取命名空间 ns = root.tag.split('}')[0].strip('{') # 用命名空间查找product元素 for r in root.findall(f'{{{ns}}}product'): # 后续判断逻辑...
方法二:使用局部名称查找(忽略命名空间)
for r in root.findall('.//*[local-name()="product"]'): # 后续判断逻辑...
5. 验证生成的XML内容
最后,你可以在写入文件前,先打印生成的XML内容,确认是否有SHOPITEM元素:
xml_content = ET.tostring(data, encoding='utf-8', xml_declaration=True) print(xml_content.decode('utf-8')) # 打印XML内容调试 with open('ociofeed.xml', 'wb') as f: f.write(xml_content) # 不需要手动调用f.close(),with语句会自动关闭文件
按照这些步骤修改后,应该能正常生成包含符合条件产品的XML Feed了。
内容的提问来源于stack exchange,提问作者user14258463
相关产品推荐
相关产品推荐

