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

Python中BeautifulSoup解析XML按属性筛选标签报错解决方法

报错原因

BeautifulSoup的find_all()方法第一个位置参数就是用来指定标签名的,这个参数的内部形参名就叫name。你写的soup.find_all("Data", name = '"ObjectClass')相当于给name参数传了两次值:第一次靠位置传了标签名"Data",第二次靠关键字传了"ObjectClass",自然会报多值传参的错误。另外你写的属性值前面多打了一个双引号,就算不报错也匹配不到目标内容。

正确写法

你要筛选的是标签上大写开头的Name属性,和find_all内置的小写name形参重名,直接当关键字参数传很容易踩坑,推荐两种稳妥的实现方式:

  • 方式1:用attrs字典传筛选条件(最通用,不会和内置参数冲突)
# 注意属性值不要加多余引号,直接写目标值ObjectClass即可
data_list = soup.find_all("Data", attrs={"Name": "ObjectClass"})
for tag in data_list:
    print(tag.get_text())

针对你给出的XML示例,运行后会输出两行computer,就是你要的匹配结果。

  • 方式2:直接传大写Name作为关键字参数(写法更简洁)
    Python对大小写敏感,find_all只认全小写的name作为标签名参数,你传大写开头的Name时,会自动被识别为标签属性筛选条件,不会触发参数冲突:
data_list = soup.find_all("Data", Name="ObjectClass")
for tag in data_list:
    print(tag.get_text())
额外提醒

不要把存储查询结果的变量和循环迭代的变量起成同一个名字,比如你之前写的Data = soup.find_all(...)之后又写for Data in Data,短代码下勉强能跑,逻辑复杂点很容易出现变量覆盖的bug,建议迭代变量用tag这类语义清晰的命名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:12:18