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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:15:02