无法使用 elementtree.find() 找到子叶子

Can't find children leafs using elementtree.find()

我想从下面的 xml 文件的最后一行输出文本 "Det norske Arbeiderparti"。我正在使用此代码,但出现以下错误:

import xml.etree.ElementTree as ET
tree = ET.parse('wiki.xml')
root = tree.getroot()
print(root.find('{http://www.mediawiki.org/xml/export-0.10/}title').text)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'text'

这是XML:

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="nb">
  <siteinfo>
    <sitename>Wikipedia</sitename>
    <dbname>nowiki</dbname>
    <base>https://no.wikipedia.org/wiki/Portal:Forside</base>
    <generator>MediaWiki 1.31.0-wmf.12</generator>
    <case>first-letter</case>
    <namespaces>
      <namespace key="-2" case="first-letter">Medium</namespace>
      <namespace key="-1" case="first-letter">Spesial</namespace>
      <namespace key="0" case="first-letter" />
      <namespace key="1" case="first-letter">Diskusjon</namespace>
      <namespace key="2" case="first-letter">Bruker</namespace>
      <namespace key="3" case="first-letter">Brukerdiskusjon</namespace>
      <namespace key="4" case="first-letter">Wikipedia</namespace>
      <namespace key="5" case="first-letter">Wikipedia-diskusjon</namespace>
      <namespace key="6" case="first-letter">Fil</namespace>
      <namespace key="7" case="first-letter">Fildiskusjon</namespace>
      <namespace key="8" case="first-letter">MediaWiki</namespace>
      <namespace key="9" case="first-letter">MediaWiki-diskusjon</namespace>
      <namespace key="10" case="first-letter">Mal</namespace>
      <namespace key="11" case="first-letter">Maldiskusjon</namespace>
      <namespace key="12" case="first-letter">Hjelp</namespace>
      <namespace key="13" case="first-letter">Hjelpdiskusjon</namespace>
      <namespace key="14" case="first-letter">Kategori</namespace>
      <namespace key="15" case="first-letter">Kategoridiskusjon</namespace>
      <namespace key="100" case="first-letter">Portal</namespace>
      <namespace key="101" case="first-letter">Portaldiskusjon</namespace>
      <namespace key="828" case="first-letter">Modul</namespace>
      <namespace key="829" case="first-letter">Moduldiskusjon</namespace>
      <namespace key="2300" case="first-letter">Gadget</namespace>
      <namespace key="2301" case="first-letter">Gadget talk</namespace>
      <namespace key="2302" case="case-sensitive">Gadget definition</namespace>
      <namespace key="2303" case="case-sensitive">Gadget definition talk</namespace>
      <namespace key="2600" case="first-letter">Sak</namespace>
    </namespaces>
  </siteinfo>
  <page>
    <title>Det norske Arbeiderparti</title>

我知道我的搜索名称是正确的,因为此代码生成正确的名称:

print(root.getchildren()[1].getchildren())

<Element '{http://www.mediawiki.org/xml/export-0.10/}title' at 0x1101ff188>

我能真正找到我想要的唯一方法是使用这段代码,但我不能在整个 xml 中使用它,因为名称在不同的地方:

print(root.getchildren()[1].find('{http://www.mediawiki.org/xml/export-0.10/}title').text)

Det norske Arbeiderparti

来自 etree 文档

find(match) Finds the first subelement matching match. match may be a tag name or path. Returns an element instance or None.

所以你应该尝试 xpath。

这应该有效:

print(root.find('.//{http://www.mediawiki.org/xml/export-0.10/}title').text)