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使用错误:
- 方法名拼写错误:
findaAll是错误写法,正确写法是findAll(BeautifulSoup 3兼容写法),更推荐用BeautifulSoup 4的标准写法find_all。 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
相关产品推荐
相关产品推荐

