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

XML解析为Pandas DataFrame遇阻,求按标签提取文本方法

嘿,我来帮你搞定XML解析提取文本到Pandas DataFrame的事儿!我猜你的XML大概是围绕Listing标签展开的,先给你一套通用的解决方案,你可以根据自己的实际结构调整~

首先,先假设你的XML结构大概是这样的(如果和你的实际结构不一样,只要对应调整标签名就行):

<Root>
  <Listings>
    <Listing>
      <ProductName>Wireless Bluetooth Speaker</ProductName>
      <Price>49.99</Price>
      <Seller>TechGear Inc</Seller>
    </Listing>
    <Listing>
      <ProductName>Cotton Throw Pillow</ProductName>
      <Price>19.95</Price>
      <Seller>HomeStyle Co</Seller>
    </Listing>
    <!-- 剩下的18个Listing结构类似 -->
  </Listings>
</Root>

第一步:导入必备库

用Python标准库的xml.etree.ElementTree解析XML,再配合Pandas转成DataFrame:

import xml.etree.ElementTree as ET
import pandas as pd

第二步:加载并解析XML

如果你的XML是本地文件,就用ET.parse();如果是从接口获取的字符串,就用ET.fromstring():

# 本地文件的情况
tree = ET.parse('your_listings.xml')
root = tree.getroot()

# XML字符串的情况(比如接口返回内容)
# xml_content = """你的XML字符串内容"""
# root = ET.fromstring(xml_content)

第三步:遍历提取所有Listing数据

核心是递归找到所有Listing标签,逐个提取子标签的文本。这里要注意XML是大小写敏感的,标签名必须完全匹配,同时要处理可能缺失的标签(避免报错):

# 用来存储所有Listing数据的列表
listing_records = []

# 递归查找所有层级下的Listing标签
for listing in root.findall('.//Listing'):
    # 提取每个子标签的文本,找不到标签就设为None
    product_name = listing.find('ProductName').text if listing.find('ProductName') is not None else None
    price = listing.find('Price').text if listing.find('Price') is not None else None
    seller = listing.find('Seller').text if listing.find('Seller') is not None else None
    
    # 把当前Listing的数据存成字典,加入列表
    listing_records.append({
        'ProductName': product_name,
        'Price': price,
        'Seller': seller
    })

第四步:转成Pandas DataFrame

这一步就很简单了,直接把字典列表传给pd.DataFrame():

df = pd.DataFrame(listing_records)
# 查看前几条数据验证结果
print(df.head())

额外小提示

  • 如果你的XML带有命名空间(比如标签是<ns:Listing>),得先处理命名空间:
    # 提取命名空间(比如标签格式是{http://example.com/ns}Listing)
    ns = root.tag.split('}')[0][1:]
    # 带命名空间查找标签
    for listing in root.findall(f'.//{{{ns}}}Listing'):
        product_name = listing.find(f'{{{ns}}}ProductName').text if listing.find(f'{{{ns}}}ProductName') is not None else None
        # 其他标签同理处理
    
  • 如果需要更复杂的XPath查找逻辑,可以用lxml库(先通过pip install lxml安装),语法和ElementTree基本一致,但支持更强大的查询功能。

这样应该就能把你的20个Listing数据完美提取到DataFrame里啦!

内容的提问来源于stack exchange,提问作者jhaywoo8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:14:09