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

如何将美国航标周更XML的District字段读取到Pandas DataFrame?

问题

尝试将美国海岸警卫队发布的航标周更新XML文件读取到Pandas DataFrame中,仅提取每条航标的District字段,但运行脚本后District列显示None。求问如何正确将该字段输出到DataFrame?

附代码:

from lxml import etree
from lxml import objectify
import pandas as pd
import pandas_read_xml as pdx
import xml.etree.ElementTree as et
 
xml_file = (r'C:\Users\LAWRENCEA\Downloads\v7d09WeeklyChanges.xml')
 
parsed_xml = et.parse(xml_file)
xroot = parsed_xml.getroot()
 
df_cols = ["District"]
rows = []
 
for record in xroot.iter('dataroot'):
    for field in record.findall('Vol_x0020_07_x0020_D9_x0020_LL_x0020_corr_x0020_thru'):
        s_District = field.attrib.get('District')
        rows.append({"District": s_District})
    
 
df = pd.DataFrame(rows, columns = df_cols)
print(df)
解决方案

1. 先排查XML结构

首先要明确XML中District字段的实际存储形式:是节点属性、子元素还是文本内容。可以先打印节点结构确认:

parsed_xml = et.parse(xml_file)
xroot = parsed_xml.getroot()
# 打印根节点下的层级结构
for child in xroot:
    print(child.tag, child.attrib)
    for subchild in child:
        print(f"  {subchild.tag}: {subchild.text}")

2. 修正提取逻辑

情况1:District是目标节点的子元素

如果District是目标节点下的子元素,修改提取代码:

df_cols = ["District"]
rows = []

# 直接遍历根节点下的目标记录节点
for record in xroot.findall('Vol_x0020_07_x0020_D9_x0020_LL_x0020_corr_x0020_thru'):
    # 提取子元素的文本内容
    s_District = record.findtext('District')
    rows.append({"District": s_District})

df = pd.DataFrame(rows, columns=df_cols)
print(df)

情况2:District是目标节点的属性

如果确认District是节点属性,调整遍历路径(无需嵌套遍历dataroot):

df_cols = ["District"]
rows = []

for record in xroot.findall('Vol_x0020_07_x0020_D9_x0020_LL_x0020_corr_x0020_thru'):
    s_District = record.attrib.get('District')
    rows.append({"District": s_District})

df = pd.DataFrame(rows, columns=df_cols)
print(df)

情况3:用pandas-read-xml简化操作

利用你已导入的pandas_read_xml直接指定xpath提取,更高效:

import pandas as pd
import pandas_read_xml as pdx

xml_file = r'C:\Users\LAWRENCEA\Downloads\v7d09WeeklyChanges.xml'

# 直接解析指定节点下的District字段
df = pdx.read_xml(xml_file, xpath=".//Vol_x0020_07_x0020_D9_x0020_LL_x0020_corr_x0020_thru", elems_only=["District"])
print(df)

关键注意点

  • 确认XML中目标节点的标签名Vol_x0020_07_x0020_D9_x0020_LL_x0020_corr_x0020_thru完全正确,避免转义或拼写错误
  • 严格区分属性和子元素的提取方式:属性用.attrib.get(),子元素用.findtext()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:55:04