使用Python的BeautifulSoup提取XML内容时遭遇空数组问题求助
问题解决:BeautifulSoup提取XML属性值返回空数组的原因及修复
问题原因
你使用find_all的语法错误,{"Trainer name": "VisitorID"}这种写法不符合BeautifulSoup的查询规则。BeautifulSoup要求先指定目标标签名,再单独声明属性过滤条件,而不是把标签和属性合并成一个字典键。
正确的提取方法
1. 单个属性值提取
先定位到指定的Trainer标签,再通过get()方法获取value属性:
from bs4 import BeautifulSoup # 假设你的XML内容存储在xml_content变量中 xml_content = """ <Trainers> <Trainer name="VisitorID" value=" NPRoiuKL213kiolkm2231"/> <Trainer name="VisitorNumber" value="BR-76594823-009922"/> <Trainer name="ServerIndex" value="213122"/> <Trainer name="VisitorPolicyID" value="ETR1234123"/> </Trainers> """ soup = BeautifulSoup(xml_content, 'xml') # 提取VisitorID对应的value visitor_id_tag = soup.find("Trainer", name="VisitorID") if visitor_id_tag: visitor_id = visitor_id_tag.get("value").strip() # 去除值开头的空格 print(visitor_id) # 输出: NPRoiuKL213kiolkm2231 # 提取VisitorNumber对应的value visitor_number_tag = soup.find("Trainer", name="VisitorNumber") if visitor_number_tag: print(visitor_number_tag.get("value")) # 输出: BR-76594823-009922
2. 批量提取所有属性值
如果需要一次性获取所有Trainer的name和value,可以循环遍历标签生成字典,方便和Pandas的结果对比验证:
trainer_data = {} for trainer_tag in soup.find_all("Trainer"): name_attr = trainer_tag.get("name") value_attr = trainer_tag.get("value").strip() trainer_data[name_attr] = value_attr print(trainer_data) # 输出结果: # { # 'VisitorID': 'NPRoiuKL213kiolkm2231', # 'VisitorNumber': 'BR-76594823-009922', # 'ServerIndex': '213122', # 'VisitorPolicyID': 'ETR1234123' # }
3. 提取<Trainers>节点本身
要获取整个<Trainers>节点,可以直接用find方法定位标签:
trainers_node = soup.find("Trainers") # 打印节点的格式化内容 print(trainers_node.prettify())
关键语法说明
soup.find("Trainer", name="VisitorID"):等价于soup.find("Trainer", {"name": "VisitorID"}),两种写法都能定位到name属性为VisitorID的Trainer标签。- 使用
get("value")而不是直接访问["value"]更安全,避免标签不存在该属性时抛出异常。 - 调用
strip()是因为你的VisitorID的value开头有空格,根据需求可以选择保留或去除。
内容的提问来源于stack exchange,提问作者Hamza Ahmed
相关产品推荐
相关产品推荐

