TypeError:’NoneType’对象不能使用BeautifulSoup XML调用Python

TypeError : 'NoneType' object not callable Python with BeautifulSoup XML

我有以下XML文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
<user-login-permission>true</user-login-permission>
        <total-matched-record-number>15000</total-matched-record-number>
        <total-returned-record-number>15000</total-returned-record-number>
       
           
                username</active-user-name>
                realm</authentication-realm>
                <user-roles>Role</user-roles>
                <user-sign-in-time>date</user-sign-in-time>
                <events>0</events>
                text</agent-type>
                <login-node>node</login-node>
             </active-user-record>

有很多记录我正在尝试从标记中获取值,并使用以下代码将其保存到其他文本文件中:

1
2
3
4
5
6
7
soup = BeautifulSoup(open("path/to/xmlfile"), features="xml")


with open('path/to/outputfile', 'a') as f:
    for i in range(len(soup.findall('active-user-name'))):
        f.write ('%s\t%s\t%s\t%s
' % (soup.findall('active-user-name')[i].text, soup.findall('authentication-realm')[i].text, soup.findall('user-roles')[i].text, soup.findall('login-node')[i].text))

我得到错误类型错误:"nonetype"对象不可调用python with beautifulsoup xml for line:for i in range(len(soup.findall('active-user-name')):

知道是什么引起的吗?

谢谢!


有许多问题需要解决,第一个问题是您提供的XML文件不是有效的XML—需要根元素。

尝试以下XML形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<root>
    <user-login-permission>true</user-login-permission>
    <total-matched-record-number>15000</total-matched-record-number>
    <total-returned-record-number>15000</total-returned-record-number>
   

       
            username</active-user-name>
            realm</authentication-realm>
            <user-roles>Role</user-roles>
            <user-sign-in-time>date</user-sign-in-time>
            <events>0</events>
            text</agent-type>
            <login-node>node</login-node>
        </active-user-record>

    </active-user-records>
</root>

现在到Python身上。首先,没有findall方法,要么是findall方法,要么是find_all方法。如本文所述,findallfind_all是等效的。

接下来,我建议您修改代码,这样您就不会经常使用find_all方法了——使用find会提高效率,特别是对于大型XML文件。此外,下面的代码更易于读取和调试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from bs4 import BeautifulSoup

xml_file = open('./path_to_file.xml', 'r')

soup = BeautifulSoup(xml_file,"xml")

with open('./path_to_output_f.txt', 'a') as f:
    for s in soup.findAll('active-user-record'):
        username = s.find('active-user-name').text
        auth = s.find('authentication-realm').text
        role = s.find('user-roles').text
        node = s.find('login-node').text
        f.write("{}\t{}\t{}\t{}
".format(username, auth, role, node))

希望这有帮助。如果您需要进一步的帮助,请通知我!


解决方法很简单:不要使用findall方法-使用find_all方法。

为什么?因为根本没有findall方法,所以有findallfind_all两种方法是等价的。有关详细信息,请参阅文档。

不过,我同意,错误消息令人困惑。

希望有帮助。


这个问题的修复方法是将beautifulsoup实例强制为类型字符串。您可以执行以下操作:https://groups.google.com/forum/!主题/comp.lang.python/ymrea29fmfi

您使用以下Python:来自python手册

STR([对象])

返回一个字符串,该字符串包含对象。对于字符串,这将返回字符串本身。差异with repr(object)是str(object)并不总是试图返回eval()可接受的字符串;其目标是返回可打印字符串。如果没有给定参数,则返回空字符串,