【问题标题】:Error with xmltodictxmltodict 错误
【发布时间】:2016-04-01 12:52:47
【问题描述】:

编辑: 我可以打印 rev['contributor'] 一段时间,但每次尝试访问 rev['contributor'] 都会返回以下内容

 TypeError: string indices must be integers

原帖: 我正在尝试使用 xml 从 xml 中提取数据以使用代码:

import xmltodict, json

with open('Sockpuppet_articles.xml', encoding='utf-8') as xml_file:
    dic_xml = xmltodict.parse(xml_file.read(), xml_attribs=False)
    print("parsed")
    for page in dic_xml['mediawiki']['page']:
        for rev in  page['revision']:
            for user in open("Sockpuppet_names.txt", "r", encoding='utf-8'):
                user = user.strip()

                if 'username' in rev['contributor'] and rev['contributor']['username'] == user:
                    dosomething()

我在 if 语句的最后一行收到此错误:

TypeError: string indices must be integers

奇怪的是,它适用于另一个 xml 文件。

【问题讨论】:

  • rev 或 rev['contributor'] 必须是列表而不是字典!
  • 我不明白。我应该如何更改类型?
  • 看不到xml就无法回答
  • 链接到相同格式的 xml drive.google.com/file/d/0B3RwXj1XHe1fX0hDUEpmRENfUWs/… 但上面使用的要大得多
  • 试过if 'username' in list(rev['contributor'].items()) and list(rev['contributor']['username'].items()) == user 但还是不行....

标签: python xml xmltodict


【解决方案1】:

当下一级只有一个元素时,我得到了同样的错误。

...

## Read XML
pastas = [os.path.join(caminho, name) for name in os.listdir(caminho)]
pastas = filter(os.path.isdir, pastas)
for pasta in pastas:
    for arq in glob.glob(os.path.join(pasta, "*.xml")):
        xmlData = codecs.open(arq, 'r', encoding='utf8').read()
        xmlDict = xmltodict.parse(xmlData, xml_attribs=True)["XMLBIBLE"]
        bible_name = xmlDict["@biblename"]
        list_verse = []
        for xml_inBook in xmlDict["BIBLEBOOK"]:
            bnumber = xml_inBook["@bnumber"]
            bname = xml_inBook["@bname"]
            for xml_chapter in xml_inBook["CHAPTER"]:
                cnumber = xml_chapter["@cnumber"]
                for xml_verse in xml_chapter["VERS"]:
                    vnumber = xml_verse["@vnumber"]
                    vtext = xml_verse["#text"]
...


TypeError: string indices must be integers

当书是“Obadiah”时发生错误。它只有一章。

单击 CHAPTER 值我们看到如下视图。那么它应该 xml_chapter 将是相同的。只有当这本书有不止一章时,这才是正确的:

但循环返回“@cnumber”而不是 OrderedDict。

我解决了只有一章时将 OrderedDict 转换为 List 的问题。

...

            if len(xml_inBook["CHAPTER"]) == 2:
                xml_chapter = list(xml_inBook["CHAPTER"].items())
                cnumber = xml_chapter[0][1]
                for xml_verse in xml_chapter[1][1]:
                    vnumber = xml_verse["@vnumber"]
                    vtext = xml_verse["#text"]
...

我正在使用 Python 3,6。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多