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

Python解析XML突发'Nonetype Object Not Callable'类型错误求助

解决XML解析中"Nonetype object is not callable"错误

问题描述

我正在开发一款解析XML文件中用户指定属性的命令行工具。参考BeautifulSoup和lxml文档编写测试代码时,起初print语句能正常返回预期数据,甚至支持用input()传参,但突然出现"Nonetype object is not callable"错误,无论使用input()还是固定参数都无法正常运行。

相关代码

from bs4 import BeautifulSoup
import argparse


with open('Sample1.xml.xml', 'r') as f:
    data = f.read()

Bs_data = BeautifulSoup(data, "xml")

findTag1 = Bs_data.findaAll('CATALOG')
findTag1Child = Bs_data.find({'COMMON': ''})
findTag1Child2 = Bs_data.find({'BOTANICAL'})



# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    print(findTag1Child)
    print(findTag1)
    print(findTag1Child2)

测试XML文件

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type='text/xsl'?>
<CATALOG>
    <PLANT>
    <COMMON>rose</COMMON>
    <BOTANICAL>canadensis</BOTANICAL>
    <ZONE>4</ZONE>
    <LIGHT>Shady</LIGHT>
    <PRICE>202</PRICE>
    <AVAILABILITY>446</AVAILABILITY>
    </PLANT>
    <PLANT>
    <COMMON>mango</COMMON>
    <BOTANICAL>sunny</BOTANICAL>
    <ZONE>3</ZONE>
    <LIGHT>shady</LIGHT>
    <PRICE>301</PRICE>
    <AVAILABILITY>569</AVAILABILITY>
    </PLANT>
    <PLANT>
    <COMMON>Marigold</COMMON>
    <BOTANICAL>palustris</BOTANICAL>
    <ZONE>4</ZONE>
    <LIGHT>Sunny</LIGHT>
    <PRICE>500</PRICE>
    <AVAILABILITY>799</AVAILABILITY>
    </PLANT>
    <PLANT>
    <COMMON>carrot</COMMON>
    <BOTANICAL>Caltha</BOTANICAL>
    <ZONE>4</ZONE>
    <LIGHT>sunny</LIGHT>
    <PRICE>205</PRICE>
    <AVAILABILITY>679</AVAILABILITY>
    </PLANT>
    <FOOD>
    <NAME>daal fry</NAME>
    <PRICE>300</PRICE>
    <DESCRIPTION>
    Famous daal tadka from surat
    </DESCRIPTION>
    <CALORIES>60</CALORIES>
    </FOOD>
    <FOOD>
    <NAME>Dhosa</NAME>
    <PRICE>350</PRICE>
    <DESCRIPTION>
    The famous south indian dish
    </DESCRIPTION>
    <CALORIES>80</CALORIES>
    </FOOD>
    <FOOD>
    <NAME>Khichdi</NAME>
    <PRICE>150</PRICE>
    <DESCRIPTION>
    The famous gujrati dish
    </DESCRIPTION>
    <CALORIES>40</CALORIES>
    </FOOD>
    <BOOK>
      <AUTHOR>Santosh Bihari</AUTHOR>
      <TITLE>PHP Core</TITLE>
      <GENER>programming</GENER>
      <PRICE>44.95</PRICE>
      <DATE>2000-10-01</DATE>
   </BOOK>
   <BOOK>
      <AUTHOR>Shyam N Chawla</AUTHOR>
      <TITLE>.NET Begin</TITLE>
      <GENER>Computer</GENER>
      <PRICE>250</PRICE>
      <DATE>2002-17-05</DATE>
   </BOOK>
   <BOOK>
      <AUTHOR>Anci C</AUTHOR>
      <TITLE>Dr. Ruby</TITLE>
      <GENER>Computer</GENER>
      <PRICE>350</PRICE>
      <DATE>2001-04-11</DATE>
   </BOOK>
</CATALOG>

错误原因与修正

出现"Nonetype object is not callable"的核心原因是代码里的语法和API使用错误:

  1. 方法名拼写错误:findaAll是错误写法,正确写法是findAll(BeautifulSoup 3兼容写法),更推荐用BeautifulSoup 4的标准写法find_all。
  2. find方法参数错误:
    • Bs_data.find({'COMMON': ''}):这种写法是查找属性为COMMON且值为空的标签,但你的XML里<COMMON>是标签名,不是属性。要找COMMON标签,直接传字符串'COMMON'即可。
    • Bs_data.find({'BOTANICAL'}):集合不能直接作为find的参数,属于语法错误。同样,找BOTANICAL标签直接传'BOTANICAL'。

修正后的代码

from bs4 import BeautifulSoup
import argparse


with open('Sample1.xml.xml', 'r') as f:
    data = f.read()

Bs_data = BeautifulSoup(data, "xml")

# 修正拼写错误,使用规范的find_all方法
findTag1 = Bs_data.find_all('CATALOG')
# 直接传入标签名进行查找
findTag1Child = Bs_data.find('COMMON')
findTag1Child2 = Bs_data.find('BOTANICAL')


if __name__ == '__main__':
    print(findTag1Child)
    print(findTag1)
    print(findTag1Child2)

额外说明

如果需要获取所有COMMON/BOTANICAL标签的文本内容,可以通过遍历find_all的结果实现:

# 获取所有COMMON标签的文本内容
all_common_text = [tag.text.strip() for tag in Bs_data.find_all('COMMON')]
print(all_common_text)

内容的提问来源于stack exchange,提问作者thclicommander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:15:27