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
相关产品推荐
相关产品推荐

