我有一个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")
什么都没打印出来。这似乎应该是一个相对简单的任务。您可以提供的任何帮助将非常感激。谢谢!
答案 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
不同。