从ElementTree findall返回的空列表

利洛卡

我是xml解析和Python的新手,所以请多多包涵。我正在使用lxml解析Wiki转储,但是我只想要每个页面,其标题和文本。

现在我有了这个:

from xml.etree import ElementTree as etree

def parser(file_name):
    document = etree.parse(file_name)
    titles = document.findall('.//title')
    print titles

目前,标题什么也没有返回。我已经看过以前这样的答案:ElementTree findall()返回空列表和lxml文档,但是大多数事情似乎都是为解析HTML而设计的。

这是我的XML的一部分:

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.7/"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.7/ http://www.mediawiki.org/xml/export-0.7.xsd" version="0.7" xml:lang="en">
  <siteinfo>
  <sitename>Wikipedia</sitename>
<base>http://en.wikipedia.org/wiki/Main_Page</base>
<generator>MediaWiki 1.20wmf9</generator>
<case>first-letter</case>
<namespaces>
  <namespace key="-2" case="first-letter">Media</namespace>
  <namespace key="-1" case="first-letter">Special</namespace>
  <namespace key="0" case="first-letter" />
  <namespace key="1" case="first-letter">Talk</namespace>
  <namespace key="2" case="first-letter">User</namespace>
  <namespace key="3" case="first-letter">User talk</namespace>
  <namespace key="4" case="first-letter">Wikipedia</namespace>
  <namespace key="5" case="first-letter">Wikipedia talk</namespace>
  <namespace key="6" case="first-letter">File</namespace>
  <namespace key="7" case="first-letter">File talk</namespace>
  <namespace key="8" case="first-letter">MediaWiki</namespace>
  <namespace key="9" case="first-letter">MediaWiki talk</namespace>
  <namespace key="10" case="first-letter">Template</namespace>
  <namespace key="11" case="first-letter">Template talk</namespace>
  <namespace key="12" case="first-letter">Help</namespace>
  <namespace key="13" case="first-letter">Help talk</namespace>
  <namespace key="14" case="first-letter">Category</namespace>
  <namespace key="15" case="first-letter">Category talk</namespace>
  <namespace key="100" case="first-letter">Portal</namespace>
  <namespace key="101" case="first-letter">Portal talk</namespace>
  <namespace key="108" case="first-letter">Book</namespace>
  <namespace key="109" case="first-letter">Book talk</namespace>
</namespaces>
  </siteinfo>
  <page>
    <title>Aratrum</title>
    <ns>0</ns>
    <id>65741</id>
    <revision>
  <id>349931990</id>
  <parentid>225434394</parentid>
  <timestamp>2010-03-15T02:55:02Z</timestamp>
  <contributor>
    <ip>143.105.193.119</ip>
  </contributor>
  <comment>/* Sources */</comment>
  <sha1>2zkdnl9nsd1fbopv0fpwu2j5gdf0haw</sha1>
  <text xml:space="preserve" bytes="1436">'''Aratrum''' is the Latin word for  [[plough]], and &quot;arotron&quot; (αροτρον) is the [[Greek language|Greek]] word. The   [[Ancient Greece|Greeks]] appear to have had diverse kinds of plough from the earliest  historical records. [[Hesiod]] advised the farmer to have always two ploughs, so that if  one broke the other might be ready for use. These ploughs should be of two kinds, the one  called &quot;autoguos&quot; (αυτογυος, &quot;self-limbed&quot;), in which the plough-tail  was of the same piece of timber as the share-beam and the pole; and the other called  &quot;pekton&quot; (πηκτον, &quot;fixed&quot;), because in it, three parts, which were of  three kinds of timber, were adjusted to one another, and fastened together by nails.

The ''autoguos'' plough was made from a [[sapling]] with two branches growing from its   trunk in opposite directions. In ploughing, the trunk served as the pole, one of the two     branches stood upwards and became the tail, and the other penetrated the ground and,    sometimes shod with bronze or iron, acted as the [[ploughshare]]. 

==Sources==
Based on an article from ''A Dictionary of Greek and Roman Antiquities,'' John Murray,     London, 1875.
ἄρατρον

==External links==
*[http://penelope.uchicago.edu/Thayer/E/Roman/Texts/secondary/SMIGRA*/Aratrum.html Smith's     Dictionary article], with diagrams, further details, sources.
[[Category:Agricultural machinery]]
[[Category:Ancient Greece]]
[[Category:Animal equipment]]</text>
</revision>
</page>

我也尝试过iterparse,然后打印找到的元素的标签:

for e in etree.iterparse(file_name):
    print e.tag

但它抱怨e没有标签属性。

编辑: 屏幕截图

z

问题是您没有考虑XML名称空间。XML文档(及其中的所有元素)在http://www.mediawiki.org/xml/export-0.7/名称空间中。要使其正常工作,您需要进行更改

titles = document.findall('.//title')

titles = document.findall('.//{http://www.mediawiki.org/xml/export-0.7/}title')

命名空间也可以通过namespaces参数提供

NSMAP = {'mw':'http://www.mediawiki.org/xml/export-0.7/'}
titles = document.findall('.//mw:title', namespaces=NSMAP)

这在Python 2.7中有效,但在Python 2.7文档中没有进行解释Python 3.3文档更好)。

另请参见http://effbot.org/zone/element-namespaces.htm,以及以下带有答案的SO问题:通过'ElementTree'在Python中使用名称空间解析XML


问题iterparse()在于此函数提供(event, element)元组(而不仅仅是元素)。为了获得标签名称,请更改

for e in etree.iterparse(file_name):
    print e.tag

对此:

for e in etree.iterparse(file_name):
    print e[1].tag

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ElementTree查找返回“无”?

来自分类Dev

ElementTree findall'or'运算符

来自分类Dev

xml.etree.ElementTree findall

来自分类Dev

xml.etree.ElementTree findall

来自分类Dev

ElementTree-findall以递归方式选择所有子元素

来自分类Dev

使用ElementTree在Python中解析XML-findall

来自分类Dev

Python将XML ElementTree findall的结果写入文件

来自分类Dev

使用ElementTree在Python中解析XML-findall

来自分类Dev

使用xml.etree.ElementTree解析XML时获取空列表作为属性

来自分类Dev

解析elementTree以XML格式返回字符串-Python

来自分类Dev

Python ElementTree

来自分类Dev

ElementTree find()/ findall()找不到带有名称空间的标记?

来自分类Dev

美丽的汤-`findAll`不能捕获SVG中的所有标签(`ElementTree`可以)

来自分类Dev

ElementTree名称空间字典无法与find()或findall()一起使用

来自分类Dev

当 findall() 找不到匹配项时,使用 ElementTree 提供解析 XML 的默认值

来自分类Dev

Python xml.ElementTree - 在变量中返回解析后的 xml 以供稍后使用的函数

来自分类Dev

使用xml.etree.ElementTree获取文件中的XML标签列表

来自分类Dev

xml.etree.ElementTree.Element.remove的项中x与列表(项)之间的差异

来自分类Dev

第二次调用后,elementtree列表的长度变为0

来自分类Dev

如何将 lxml.etree._ElementTree 列表保存到文件

来自分类Dev

findall / 3返回一个空列表而不是解决方案

来自分类Dev

ElementTree并使用NameSpaces查找

来自分类Dev

使用ElementTree修改XML

来自分类Dev

ElementTree删除元素

来自分类Dev

使用ElementTree解析XML

来自分类Dev

不能再从ElementTree导入

来自分类Dev

ElementTree找不到元素

来自分类Dev

ElementTree:解析XML的曾孙

来自分类Dev

Python ElementTree 解析顺序

Related 相关文章

  1. 1

    ElementTree查找返回“无”?

  2. 2

    ElementTree findall'or'运算符

  3. 3

    xml.etree.ElementTree findall

  4. 4

    xml.etree.ElementTree findall

  5. 5

    ElementTree-findall以递归方式选择所有子元素

  6. 6

    使用ElementTree在Python中解析XML-findall

  7. 7

    Python将XML ElementTree findall的结果写入文件

  8. 8

    使用ElementTree在Python中解析XML-findall

  9. 9

    使用xml.etree.ElementTree解析XML时获取空列表作为属性

  10. 10

    解析elementTree以XML格式返回字符串-Python

  11. 11

    Python ElementTree

  12. 12

    ElementTree find()/ findall()找不到带有名称空间的标记?

  13. 13

    美丽的汤-`findAll`不能捕获SVG中的所有标签(`ElementTree`可以)

  14. 14

    ElementTree名称空间字典无法与find()或findall()一起使用

  15. 15

    当 findall() 找不到匹配项时,使用 ElementTree 提供解析 XML 的默认值

  16. 16

    Python xml.ElementTree - 在变量中返回解析后的 xml 以供稍后使用的函数

  17. 17

    使用xml.etree.ElementTree获取文件中的XML标签列表

  18. 18

    xml.etree.ElementTree.Element.remove的项中x与列表(项)之间的差异

  19. 19

    第二次调用后,elementtree列表的长度变为0

  20. 20

    如何将 lxml.etree._ElementTree 列表保存到文件

  21. 21

    findall / 3返回一个空列表而不是解决方案

  22. 22

    ElementTree并使用NameSpaces查找

  23. 23

    使用ElementTree修改XML

  24. 24

    ElementTree删除元素

  25. 25

    使用ElementTree解析XML

  26. 26

    不能再从ElementTree导入

  27. 27

    ElementTree找不到元素

  28. 28

    ElementTree:解析XML的曾孙

  29. 29

    Python ElementTree 解析顺序

热门标签

归档