如何使用BeautifulSoup4遍历XML元素提取SMS属性解决findall报错问题
问题排查与修复
你遇到的问题有两个:
- 方法名拼写错误:BeautifulSoup 查找所有匹配标签的方法是
find_all(),你的代码写的是findall,缺少中间的下划线,soup对象不存在该方法就会返回None,调用None就触发了TypeError: 'NoneType' object is not callable报错。 - 循环逻辑错误:你已经拿到了所有sms标签的列表,遍历的时候不需要再用
soup.find('sms')全局查找,这行代码每次都会返回整个XML里的第一个sms标签,即便修复了第一个报错,输出的三条结果也会全部是第一条短信的内容,直接使用循环变量即可。
修正后的可运行代码
from bs4 import BeautifulSoup import csv # 读取XML文件 with open('texts.xml', 'r', encoding='utf-8') as f: data = f.read() soup = BeautifulSoup(data, "xml") # 修正方法名,查找所有sms标签 allsms = soup.find_all('sms') # 打印预期内容 for sms in allsms: address = sms.get('address') real_date = sms.get('readable_date') print(f"{address} - {real_date}") # 可选:直接导出为CSV文件 with open('sms导出.csv', 'w', newline='', encoding='utf-8-sig') as csv_file: writer = csv.writer(csv_file) # 写入表头 writer.writerow(['联系号码', '收发时间', '短信内容', '联系人姓名', '收发类型']) for sms in allsms: writer.writerow([ sms.get('address'), sms.get('readable_date'), sms.get('body'), sms.get('contact_name'), '接收' if sms.get('type') == '1' else '发送' ])
运行上述代码即可输出你预期的结果,同时也能直接生成符合需求的CSV文件。
内容的提问来源于stack exchange,提问作者pablo_teacte
相关产品推荐
相关产品推荐

