Python使用BeautifulSoup如何获取含连字符的XML标签文本
问题原因
Python语法规定,标识符(变量名、属性名等)只能由字母、数字、下划线组成,不能包含连字符-。你使用点属性访问写法idi[x].event-id时,Python会将其解析为idi[x].event 减去 id的运算逻辑,自然会抛出未定义变量的错误,无法识别你要访问event-id标签的需求。
你把标签名的连字符换成下划线后,event_id符合Python标识符命名规则,点属性访问可以正常生效,所以能拿到结果。
解决方案
不需要修改原XML文件,两种常用的兼容写法如下:
- 方法1:通过
find()方法指定标签名查询,兼容性最好,所有特殊命名的标签都可以用这种方式获取
把代码中获取idText的行替换为:idText = idi[x].find('event-id').get_text() - 方法2:通过
getattr()动态获取属性
也可以用Python内置的getattr方法规避标识符命名限制,写法如下:idText = getattr(idi[x], 'event-id').get_text()
修正后完整可运行代码
from bs4 import BeautifulSoup dir_path = '20211006085201.xml' with open(dir_path, encoding='UTF-8') as file: contents = file.read() soup = BeautifulSoup(contents, 'xml') events = soup.find_all('fullEventUpdate') print(' \n-------', len(events), 'events calculated on ', dir_path, '--------\n') idi = soup.find_all('event-reference') for x in range(0, len(events)): idText = idi[x].find('event-id').get_text() print(idText)
注:这里额外把文件读取改成了with open的写法,会自动关闭文件句柄,避免资源泄漏
内容的提问来源于stack exchange,提问作者Esteban Estrada
相关产品推荐
相关产品推荐

