使用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())
修改说明
- 用
<root>标签包裹原始XML内容,让整个文档拥有唯一根节点,满足XML规范 - 直接用
find_all("symbol")获取所有symbol节点(也可以保留soup.select("symbol")写法) - 调用
strip()去除文本中的空白字符,让输出更整洁
运行修改后的代码,就能得到期望的输出:
WDS PAM
内容的提问来源于stack exchange,提问作者SMTH
相关产品推荐
相关产品推荐

