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

如何用xml.etree.ElementTree处理带Atom命名空间的XML数据?

处理ArXiv XML的命名空间问题并提取指定字段

当你用xml.etree.ElementTree解析带http://www.w3.org/2005/Atom命名空间的ArXiv XML时,所有标签都会被解析成带命名空间前缀的形式(比如{http://www.w3.org/2005/Atom}title),直接用find('title')这类写法会找不到元素。下面是具体的解决方法:

1. 定义命名空间映射

先把Atom的命名空间URL映射成一个易记的前缀(比如atom),后续查找元素时更简洁:

NS = {'atom': 'http://www.w3.org/2005/Atom'}

2. 提取指定字段的示例代码

以下是完整的解析流程,包含获取XML、解析并提取title、summary、id、author等常用字段:

import xml.etree.ElementTree as ET
import requests

# 从ArXiv API获取XML数据
response = requests.get('http://export.arxiv.org/api/query?search_query=all:machine_learning&max_results=2')
xml_content = response.content

# 解析XML
root = ET.fromstring(xml_content)

# 定义命名空间映射
NS = {'atom': 'http://www.w3.org/2005/Atom'}

# 遍历entry节点并提取字段
arxiv_papers = []
for entry in root.findall('atom:entry', NS):
    # 提取标题
    title = entry.find('atom:title', NS).text.strip()
    # 提取摘要
    summary = entry.find('atom:summary', NS).text.strip()
    # 提取ArXiv ID(从id标签中截取)
    arxiv_id = entry.find('atom:id', NS).text.split('/')[-1]
    # 提取所有作者
    authors = [author.find('atom:name', NS).text for author in entry.findall('atom:author', NS)]
    
    # 整理为字典格式
    paper_info = {
        'arxiv_id': arxiv_id,
        'title': title,
        'summary': summary,
        'authors': authors
    }
    arxiv_papers.append(paper_info)

# 输出整理后的数据
for paper in arxiv_papers:
    print(f"ID: {paper['arxiv_id']}")
    print(f"标题: {paper['title']}")
    print(f"作者: {', '.join(paper['authors'])}")
    print(f"摘要: {paper['summary'][:100]}...\n")

3. 关键说明

  • 使用findall('atom:entry', NS)时,第二个参数NS是命名空间映射,用于告知解析器atom:前缀对应的命名空间URL。
  • 若不想定义映射,也可以直接使用完整的带命名空间标签名,比如root.findall('{http://www.w3.org/2005/Atom}entry'),但这种写法可读性较差。
  • 其他字段(如published发布时间、updated更新时间)的提取逻辑完全一致,只需替换对应的标签名即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:47:27