2010-12-16 21 views
29

¿Cómo puedo extraer el primer párrafo de un artículo de Wikipedia, utilizando Python?Extraiga el primer párrafo de un artículo de Wikipedia (Python)

Por ejemplo, para Albert Einstein, que sería:

Albert Einstein (pronunciado/ælbərt aɪnstaɪn /; alemán: [albɐt aɪnʃtaɪn] (escuchar), 14 de marzo de 1879 - 18 de abril 1955) fue un físico teórico, filósofo y autor que es ampliamente considerado como uno de los más influyentes e icónicos científicos e intelectuales de todos los tiempos. A Premio Nobel de Alemania-Alemán, Einstein a menudo se considera como el padre de la física moderna . [2] Recibió el Premio Nobel de Física 1921 "por sus servicios a la física teórica, y especialmente por su descubrimiento de la ley del efecto fotoeléctrico". [3]

+2

'urllib' para obtener la página y' BeautifulSoup' para analizar HTML. Aunque hay otras formas de hacerlo, búscalas en StackOverflow. Esto ha sido discutido muchas veces. – user225312

+0

¿qué marcado desea que tenga? mediawiki, html? – khachik

+0

HTML. (Límite de 15 caracteres) –

Respuesta

37

Hace algún tiempo hizo dos clases para obtener artículos de Wikipedia en texto plano. Yo sé que ellos no son la mejor solución, pero se puede adaptar a sus necesidades:

        wikipedia.py
        wiki2plain.py

Usted puede utilizar de esta manera:

from wikipedia import Wikipedia 
from wiki2plain import Wiki2Plain 

lang = 'simple' 
wiki = Wikipedia(lang) 

try: 
    raw = wiki.article('Uruguay') 
except: 
    raw = None 

if raw: 
    wiki2plain = Wiki2Plain(raw) 
    content = wiki2plain.text 
+1

En http://pastebin.com/FVDxLWNG #REDIRECT no funciona para it.wikipedia.org, debe traducirse al italiano, como #RINVIA. Sospecho que #REDIRECT funciona solo para inglés. –

+0

+1 para la función "unwiki". Muy agradable. – HerrKaputt

0

probar una combinación de urllib a buscar el sitio y BeautifulSoup o lxml para analizar los datos.

+0

Estoy muy contento de analizar html a mano. hoooo yeahhh – dzen

2

Si quiere sugerencias de la biblioteca, me vienen a la mente las sugerencias de la biblioteca, BeautifulSoup, urllib2. Respondido en SO antes: Web scraping with Python.

He intentado con urllib2 para obtener una página de Wikipedia. Pero, era 403 (prohibido). MediaWiki proporciona API para Wikipedia, compatible con varios formatos de salida. No he usado python-wikitools, pero puede valer la pena intentarlo. http://code.google.com/p/python-wikitools/

+0

usando BeautifulSoup – dheerosaur

+0

probablemente wikipedia está bloqueando algún useragent :) – dzen

1

Como han dicho otros, un enfoque es utilizar la API de wikimedia y urllib o urllib2. Los fragmentos de código a continuación son parte de lo que utilicé para extraer lo que se llama la sección "lead", que tiene el resumen del artículo y el cuadro de información. Esto verificará si el texto devuelto es una redirección en lugar de contenido real, y también le permitirá omitir el cuadro de información si está presente (en mi caso utilicé un código diferente para extraer y formatear el cuadro de información.

contentBaseURL='http://en.wikipedia.org/w/index.php?title=' 

def getContent(title): 
    URL=contentBaseURL+title+'&action=raw&section=0' 
    f=urllib.urlopen(URL) 
    rawContent=f.read() 
    return rawContent 

infoboxPresent = 0 
# Check if a redirect was returned. If so, go to the redirection target 
    if rawContent.find('#REDIRECT') == 0: 
     rawContent = getFullContent(title) 
     # extract the redirection title 
     # Extract and format the Infobox 
     redirectStart=rawContent.find('#REDIRECT[[')+11 
     count = 0 
     redirectEnd = 0 
     for i, char in enumerate(rawContent[redirectStart:-1]): 
      if char == "[": count += 1 
      if char == "]}": 
       count -= 1 
       if count == 0: 
        redirectEnd = i+redirectStart+1 
        break 
     redirectTitle = rawContent[redirectStart:redirectEnd] 
     print 'redirectTitle is: ',redirectTitle 
     rawContent = getContent(redirectTitle) 

    # Skip the Infobox 
    infoboxStart=rawContent.find("{{Infobox") #Actually starts at the double {'s before "Infobox" 
    count = 0 
    infoboxEnd = 0 
    for i, char in enumerate(rawContent[infoboxStart:-1]): 
     if char == "{": count += 1 
     if char == "}": 
      count -= 1 
      if count == 0: 
       infoboxEnd = i+infoboxStart+1 
       break 

    if infoboxEnd <> 0: 
     rawContent = rawContent[infoboxEnd:] 

Volverás a recibir el texto en bruto, incluido el marcado de wiki, por lo que tendrás que hacer un poco de limpieza. Si solo desea el primer párrafo, no toda la primera sección, busque el primer carácter de la nueva línea.

9

Lo que hice es la siguiente:

import urllib 
import urllib2 
from BeautifulSoup import BeautifulSoup 

article= "Albert Einstein" 
article = urllib.quote(article) 

opener = urllib2.build_opener() 
opener.addheaders = [('User-agent', 'Mozilla/5.0')] #wikipedia needs this 

resource = opener.open("http://en.wikipedia.org/wiki/" + article) 
data = resource.read() 
resource.close() 
soup = BeautifulSoup(data) 
print soup.find('div',id="bodyContent").p 
34

escribí una biblioteca de Python que tiene como objetivo hacer esto muy fácil. Échale un vistazo al Github.

Para instalarlo, ejecute

$ pip install wikipedia 

Luego de conseguir el primer párrafo de un artículo, sólo tiene que utilizar la función wikipedia.summary.

>>> import wikipedia 
>>> print wikipedia.summary("Albert Einstein", sentences=2) 

impresiones

Albert Einstein (/ ælbərt aɪnstaɪn /; alemán: [albɐt aɪnʃtaɪn] ( escuchar); marzo 14, 1879 hasta abril 18, 1955) fue un físico teórico de origen alemán que desarrolló la teoría general de la relatividad, uno de los dos pilares de la física moderna (junto con la mecánica cuántica ). Aunque mejor conocido por su fórmula de equivalencia de masa-energía E = mc2 (que ha sido llamada "la ecuación más famosa del mundo"), recibió el Premio Nobel de Física de 1921 "por sus servicios a la física teórica , y especialmente por su descubrimiento de la ley de el efecto fotoeléctrico ".

En cuanto a cómo funciona, wikipedia hace una petición a la Mobile Frontend Extension de la API MediaWiki, que devuelve las versiones de optimización para móviles de los artículos de Wikipedia. Para ser específicos, al pasar los parámetros prop=extracts&exsectionformat=plain, los servidores de MediaWiki analizarán el texto de Wikitext y devolverán un resumen de texto sin formato del artículo que está solicitando, incluyendo e incluyendo el texto completo de la página. También acepta los parámetros exchars y exsentences, que, como es lógico, limitan el número de caracteres y oraciones devueltos por la API.

+3

¡La biblioteca está muy bien diseñada y es muy fácil de usar! Buen trabajo. :) – Kitchi

+0

¿puedo hacer que funcione detrás de un proxy? – kuroop

+0

'prop = extracts' se dividió en MobileFrontend en una extensión separada [TextExtracts] (https://www.mediawiki.org/wiki/Extension:TextExtracts#API) en 2014, pero la llamada API no se modificó. – skierpage

0

Probar pattern.

pip install pattern 

from pattern.web import Wikipedia 
article = Wikipedia(language="af").search('Kaapstad', throttle=10) 
print article.string 
6

Wikipedia ejecuta una extensión MediaWiki que proporciona exactamente esta funcionalidad como un módulo API. TextExtracts implementa action=query&prop=extracts con opciones para devolver las primeras frases N y/o solo la introducción, como HTML o texto sin formato.

Aquí está la API de llamada que desea realizar, probarlo: https://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Albert%20Einstein&exintro=&exsentences=2&explaintext=&redirects=&formatversion=2

  • action=query&prop=extracts Para solicitar esta información
  • (ex) frases = 2, (ex) de introducción =, (ex) texto plano, son parámetros del módulo (vea el primer enlace para su doc ​​API) pidiendo dos oraciones de la introducción como texto sin formato; deje este último para HTML.
  • redirects= (verdadero) por lo que si usted pide "títulos = Einstein", obtendrá la página de información
  • formatversion=2 Albert Einstein para un formato más limpio en UTF-8.

Existen varias bibliotecas que envuelven la invocación de la API de acción de MediaWiki, como la que se encuentra en la respuesta de DGund, pero no es demasiado difícil hacer las llamadas de API usted mismo.

Page info in search results explica cómo obtener este extracto de texto, junto con obtener una descripción y una imagen principal de los artículos.

Cuestiones relacionadas