18

例如使用这个维基百科转储:

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=lebron%20james&rvprop=content&redirects=true&format=xmlfm

是否有现有的 Python 库可用于创建具有主题和值映射的数组?

例如:

{height_ft,6},{nationality, American}
4

9 回答 9

13

看起来您真的希望能够解析 MediaWiki 标记。为此目的设计了一个名为mwlib的 python 库。您可以使用 python 的内置 XML 包从 API 的响应中提取页面内容,然后将该内容传递到 mwlib 的解析器以生成可以在代码中浏览和分析以提取所需信息的对象表示。mwlib 是 BSD 许可的。

于 2010-08-12T01:26:44.517 回答
6

刚刚偶然发现 PyPi 上的一个库wikidump,它声称提供

从维基百科转储中操作和提取数据的工具

我还没用过,你自己试试吧……

于 2010-08-12T16:32:52.617 回答
6

我在这篇文章中描述了如何结合使用 pywikibot 和mwparserfromhell来做到这一点(还没有足够的声誉来标记为重复)。

In [1]: import mwparserfromhell

In [2]: import pywikibot

In [3]: enwp = pywikibot.Site('en','wikipedia')

In [4]: page = pywikibot.Page(enwp, 'Waking Life')            

In [5]: wikitext = page.get()               

In [6]: wikicode = mwparserfromhell.parse(wikitext)

In [7]: templates = wikicode.filter_templates()

In [8]: templates?
Type:       list
String Form:[u'{{Use mdy dates|date=September 2012}}', u"{{Infobox film\n| name           = Waking Life\n| im <...> critic film|waking-life|Waking Life}}', u'{{Richard Linklater}}', u'{{DEFAULTSORT:Waking Life}}']
Length:     31
Docstring:
list() -> new empty list
list(iterable) -> new list initialized from iterable's items

In [10]: templates[:2]
Out[10]: 
[u'{{Use mdy dates|date=September 2012}}',
 u"{{Infobox film\n| name           = Waking Life\n| image          = Waking-Life-Poster.jpg\n| image_size     = 220px\n| alt            =\n| caption        = Theatrical release poster\n| director       = [[Richard Linklater]]\n| producer       = [[Tommy Pallotta]]<br />[[Jonah Smith]]<br />Anne Walker-McBay<br />Palmer West\n| writer         = Richard Linklater\n| starring       = [[Wiley Wiggins]]\n| music          = Glover Gill\n| cinematography = Richard Linklater<br />[[Tommy Pallotta]]\n| editing        = Sandra Adair\n| studio         = [[Thousand Words]]\n| distributor    = [[Fox Searchlight Pictures]]\n| released       = {{Film date|2001|01|23|[[Sundance Film Festival|Sundance]]|2001|10|19|United States}}\n| runtime        = 101 minutes<!--Theatrical runtime: 100:40--><ref>{{cite web |title=''WAKING LIFE'' (15) |url=http://www.bbfc.co.uk/releases/waking-life-2002-3|work=[[British Board of Film Classification]]|date=September 19, 2001|accessdate=May 6, 2013}}</ref>\n| country        = United States\n| language       = English\n| budget         =\n| gross          = $3,176,880<ref>{{cite web|title=''Waking Life'' (2001)|work=[[Box Office Mojo]] |url=http://www.boxofficemojo.com/movies/?id=wakinglife.htm|accessdate=March 20, 2010}}</ref>\n}}"]

In [11]: infobox_film = templates[1]

In [12]: for param in infobox_film.params:
             print param.name, param.value

 name             Waking Life

 image            Waking-Life-Poster.jpg

 image_size       220px

 alt             

 caption          Theatrical release poster

 director         [[Richard Linklater]]

 producer         [[Tommy Pallotta]]<br />[[Jonah Smith]]<br />Anne Walker-McBay<br />Palmer West

 writer           Richard Linklater

 starring         [[Wiley Wiggins]]

 music            Glover Gill

 cinematography   Richard Linklater<br />[[Tommy Pallotta]]

 editing          Sandra Adair

 studio           [[Thousand Words]]

 distributor      [[Fox Searchlight Pictures]]

 released         {{Film date|2001|01|23|[[Sundance Film Festival|Sundance]]|2001|10|19|United States}}

 runtime          101 minutes<!--Theatrical runtime: 100:40--><ref>{{cite web |title=''WAKING LIFE'' (15) |url=http://www.bbfc.co.uk/releases/waking-life-2002-3|work=[[British Board of Film Classification]]|date=September 19, 2001|accessdate=May 6, 2013}}</ref>

 country          United States

 language         English

 budget          

 gross            $3,176,880<ref>{{cite web|title=''Waking Life'' (2001)|work=[[Box Office Mojo]] |url=http://www.boxofficemojo.com/movies/?id=wakinglife.htm|accessdate=March 20, 2010}}</ref>

不要忘记 params 也是 mwparserfromhell 对象!

于 2014-01-16T19:35:25.617 回答
3

我知道这个问题很老,但我正在寻找一个解析维基百科 xml 转储的库。但是,建议的库 wikidump 和 mwlib 并没有提供很多代码文档。然后,我找到了 Mediwiki-utilities,其中有一些代码文档: http ://pythonhosted.org/mediawiki-utilities/ 。

于 2015-03-12T20:25:36.097 回答
3

WikiExtractor 似乎是当今在 Python 中执行此操作的一种干净、简单且有效的方法:https ://github.com/attardi/wikiextractor

它提供了一种将 Wikipedia 转储解析为简单文件结构的简单方法,如下所示:

<doc>...</doc>
<doc>...</doc>
...
<doc>...</doc>

...每个文档的样子:

<doc id="2" url="http://it.wikipedia.org/wiki/Harmonium">
Harmonium.
L'harmonium è uno strumento musicale azionato con una tastiera, detta manuale.
Sono stati costruiti anche alcuni harmonium con due manuali.
...
</doc>
于 2016-10-26T03:37:32.597 回答
1

我知道这是一个老问题,但我这里是一个很棒的脚本,它读取 wiki 转储 xml 并输出一个非常好的 csv:

PyPI:https ://pypi.org/project/wiki-dump-parser/

GitHub:https ://github.com/Grasia/wiki-scripts/tree/master/wiki_dump_parser

于 2020-06-09T17:54:33.483 回答
0

这里有一些关于 Python 和 XML 库的信息

如果您要问是否有专门用于解析 Wiki(pedia) XML 并满足您的要求的现有库,这是值得怀疑的。但是,您可以使用现有库之一来遍历 DOM 并提取您需要的数据。

另一种选择是编写一个类似的 XSLT 样式表并使用 lxml 调用它。这还允许您从 XSLT 内部调用 Python 函数,从而获得两全其美的效果。

于 2010-08-11T23:19:26.563 回答
-2

您可能正在寻找用于操作 wikipedia API的Pywikipediabot 。

于 2010-09-11T17:44:51.543 回答
-6

我会说看看使用Beautiful Soup并以 HTML 格式获取 Wikipedia 页面,而不是使用 API。

我将尝试发布一个示例。

于 2010-08-11T23:23:10.800 回答