使用elementtree.find()找不到子叶子

时间:2018-03-02 13:07:41

标签: python xml elementtree

我想从下面的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

1 个答案:

答案 0 :(得分:1)

来自etree Documentation

  

查找(匹配)   查找第一个匹配匹配的子元素。 match可以是标签名称或路径。返回元素实例或None。

所以你应该试试xpath。

这应该有效:

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