从XML Wiki转储中检索所有文章标题 - Python

时间:2016-04-05 00:41:35

标签: python xml xml-parsing

我有一个Wikipedia XML转储,它是通过导出某个类别的所有页面而创建的。您可以在https://en.wikipedia.org/wiki/Special:Export为自己生成一个XML文件,从而查看此XML文件的确切结构。现在我想用Python列出每篇文章的标题。我尝试过使用:

import xml.etree.ElementTree as ET

tree = ET.parse('./comp_sci_wiki.xml')
root = tree.getroot()

for element in root:
    for sub in element:
        print sub.find("title")

什么都没打印出来。这似乎应该是一个相对简单的任务。您可以提供的任何帮助将非常感激。谢谢!

1 个答案:

答案 0 :(得分:2)

如果查看导出文件的开头,您将看到该文档声明了一个默认的XML命名空间:

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLo

这意味着文档中没有未命名的“title”元素, 这是您的sub.find("title")语句失败的原因之一。 如果要打印root元素,可以看到这个:

>>> print root
<Element '{http://www.mediawiki.org/xml/export-0.10/}mediawiki' at 0x7f2a45df6c10>

请注意,它没有说<Element 'mediawiki'>。标识符包括完整名称空间。 This document详细描述了如何使用XML文档中的命名空间,但是tl; dir版本是您需要的:

>>> from xml.etree import ElementTree as ET
>>> tree=ET.parse('/home/lars/Downloads/Wikipedia-20160405005142.xml')
>>> root = tree.getroot()
>>> ns = 'http://www.mediawiki.org/xml/export-0.10/
>>> for page in root.findall('{%s}page' % ns):
...   print (page.find('{%s}title' % ns).text)
... 
Category:Wikipedia books on computer science
Computer science in sport
Outline of computer science
Category:Unsolved problems in computer science
Category:Philosophy of computer science
[...etc...]
>>> 

如果要安装,那么你的生活可能会更容易 lxml模块,包括完整的xpath支持,允许您 做这样的事情:

>>> nsmap={'x': 'http://www.mediawiki.org/xml/export-0.10/'}
>>> for title in tree.xpath('//x:title', namespaces=nsmap):
...   print (title.text)
... 
Category:Wikipedia books on computer science
Computer science in sport
Outline of computer science
Category:Unsolved problems in computer science
Category:Philosophy of computer science
Category:Computer science organizations
[...etc...]

无论如何,请阅读有关命名空间支持的文档,并希望如此 加上这些例子将指出你正确的方向。该 外卖应该是XML命名空间很重要,title在 一个名称空间与另一个名称空间中的title不同。