如何将美国航标周更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
相关产品推荐
相关产品推荐

