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

使用BeautifulSoup的xml解析器仅提取首个symbol,如何获取全部?

问题:使用BeautifulSoup的xml解析器无法获取全部symbol字段

我需要读取文本文件中XML内容里的所有symbol字段。目前用BeautifulSoup的xml解析器只能拿到第一个symbol;换成lxml解析器能获取两个,但会弹出警告。因为内容是XML格式,希望坚持用xml解析器实现需求。

原始XML内容

<?xml version="1.0" encoding="utf-8"?>
<lookupdata symbolstring="WDS">
    <key>
        <symbol>WDS</symbol>
        <exchange>NYE</exchange>
        <openfigi>BBG001S5WCY6</openfigi>
        <qmidentifier>USI79Z473117AAG</qmidentifier>
    </key>
    <equityinfo>
        <longname>
        Woodside Energy Group Limited American Depositary Shares each representing one
        </longname>
        <shortname>Woodside Energy </shortname>
        2
        <instrumenttype>equity</instrumenttype>
        <sectype>DR</sectype>
        <isocfi>EDSXFR</isocfi>
        <issuetype>AD</issuetype>
        <proprietaryquoteeligible>false</proprietaryquoteeligible>
    </equityinfo>
</lookupdata>
<lookupdata symbolstring="PAM">
    <key>
        <symbol>PAM</symbol>
        <exchange>NYE</exchange>
        <openfigi>BBG001T5K0S1</openfigi>
        <qmidentifier>USI68Z3Z75887AS</qmidentifier>
    </key>
    <equityinfo>
        <longname>Pampa Energia S.A.</longname>
        <shortname>PAM</shortname>
        <instrumenttype>equity</instrumenttype>
        <sectype>DR</sectype>
        <isocfi>EDSXFR</isocfi>
        <issuetype>AD</issuetype>
    </equityinfo>
</lookupdata>

当前使用的代码

from bs4 import BeautifulSoup

with open("input_xml.txt") as infile:
    item = infile.read()

soup = BeautifulSoup(item,"xml")
for item in soup.select("lookupdata symbol"):
    print(item.text)

当前输出

WDS

期望输出

WDS
PAM

解决方案

问题出在XML结构不符合标准:XML要求必须有唯一的根节点,而你提供的内容有两个顶级<lookupdata>节点。xml解析器会自动截断第二个顶级节点,因此只能解析出第一个symbol。

解决方法是手动给XML添加一个根节点,让内容符合标准结构,之后xml解析器就能正常识别所有节点了:

from bs4 import BeautifulSoup

with open("input_xml.txt") as infile:
    item = infile.read()

# 给原始XML包裹根节点,修正结构
wrapped_xml = f"<root>{item}</root>"
soup = BeautifulSoup(wrapped_xml, "xml")

# 遍历所有symbol节点并输出内容
for symbol in soup.find_all("symbol"):
    print(symbol.text.strip())

修改说明

  1. 用<root>标签包裹原始XML内容,让整个文档拥有唯一根节点,满足XML规范
  2. 直接用find_all("symbol")获取所有symbol节点(也可以保留soup.select("symbol")写法)
  3. 调用strip()去除文本中的空白字符,让输出更整洁

运行修改后的代码,就能得到期望的输出:

WDS
PAM

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:25:31