首页 文章

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

提问于
浏览
0

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

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 回答

  • 1

    如果查看导出文件的开头,您将看到该文档声明了一个默认的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...]
    >>>
    

    如果您要安装包含完整xpath支持的 lxml 模块,那么您的生活可能会更容易,这样您就可以执行以下操作:

    >>> 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 不同 .

相关问题