Respuesta

10

Parece que realmente quiere poder analizar el marcado de MediaWiki. Hay una biblioteca de Python diseñada para este propósito llamada mwlib. Puedes usar los paquetes XML integrados de Python para extraer el contenido de la página de la respuesta de la API, luego pasar ese contenido al analizador de mwlib para producir una representación de objetos que puedes explorar y analizar en código para extraer la información que deseas. mwlib tiene licencia BSD.

+1

thx por la ayuda. Probé el tutorial de mwlib en el enlace que me diste Sin embargo, no estoy seguro de cómo manipulo con el objeto Article que devuelve el simpleparse. Por ejemplo, ¿cómo puedo reconstruir todos los datos en formato xml con sus títulos apropiados? – tomwu

+0

¿Alguna herramienta actual está trabajando ahora? –

+0

@quantCode Honestamente, no he visto el estado de estas herramientas en los últimos años, pero un vistazo rápido a [el informe de Github del proyecto] (https://github.com/pediapress/mwlib) muestra que mwlib se vuelve regular, si es infrecuente, actualizaciones. Probablemente aún vale la pena mirar si estás planeando hacer algo en este espacio. – chaos95

0

Hay algo de información sobre las bibliotecas de Python y XML here.

Si está preguntando si hay una biblioteca existente que esté diseñada para analizar XML de Wiki (pedia) específicamente y que coincida con sus requisitos, esto es dudoso. Sin embargo, puede usar una de las bibliotecas existentes para recorrer el DOM y extraer los datos que necesita.

Otra opción es escribir una hoja de estilo XSLT que sea similar y llamarla usando lxml. Esto también le permite hacer llamadas a las funciones de Python desde dentro del XSLT para que obtenga lo mejor de ambos mundos.

+0

Joder, ¿por qué la downvote. Si tu respuesta es mejor, deja que valga la pena, la mía no fue totalmente errónea. – imoatama

-5

Diría que usa Beautiful Soup y acaba de obtener la página de Wikipedia en HTML en lugar de usar la API.

Voy a tratar de poner un ejemplo.

+0

Sé que esta es una vieja pregunta, pero para cualquiera que tropiece con esto, absolutamente ** NO ** haz esto. La razón completa por la que Wikipedia ofrece una API es para que puedan * eficientemente * devolver los datos sin procesar que necesitan los usuarios. El raspado causa un estrés completamente innecesario en los servidores invocando los motores de renderizado y devolviendo el contenido del artículo * all *. Las API omiten la representación y se pueden utilizar para extraer solo el subconjunto de datos que el usuario realmente necesita (por ejemplo, una sola sección). El raspado siempre debe usarse como último recurso (es decir, si un sitio no ofrece una API). – Geoff

+0

E incluso si el HTML revelara la estructura subyacente a la perfección, aún tendría que entender el concepto de plantillas, páginas de desambiguación, redirecciones, etc. Mejor procesar la fuente donde está a la vista con un marcado razonablemente semántico. – tripleee

5

Sólo tropezó con una biblioteca en PyPi, wikidump, que pretende proporcionar

Herramientas para manipular y extraer datos de Wikipedia volcados

no hice uso de él todavía, por lo que son por su cuenta para probarlo ...

3

Describí cómo hacer esto usando una combinación de pywikibot y mwparserfromhell en this post (aún no tengo suficiente reputación como para marcar como un duplicado).

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> 

¡No olvide que los params son objetos mwparserfromhell!

1

Sé que la pregunta es antigua, pero estaba buscando una biblioteca que analiza el volcado de wikipedia xml. Sin embargo, las bibliotecas sugeridas, wikidump y mwlib, no ofrecen mucha documentación de código. Luego, encontré Mediwiki-utilities, que tiene alguna documentación de código en: http://pythonhosted.org/mediawiki-utilities/.

+0

proyecto genial pero solo funciona con python 3 – GrantD71

0

WikiExtractor parece ser una manera limpia, simple y eficiente de hacer esto en Python hoy: https://github.com/attardi/wikiextractor

Se proporciona una manera fácil de analizar una Wikipedia volcado en una estructura simple de archivos, así:

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

... donde cada documento se parece a:

<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> 
Cuestiones relacionadas