tutorial - Extraiga el primer párrafo de un artículo de Wikipedia(Python)
python español (10)
¿Cómo puedo extraer el primer párrafo de un artículo de Wikipedia, usando Python?
Por ejemplo, para Albert Einstein , eso 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 de 1955) fue un físico teórico, filósofo y autor ampliamente considerado como uno de los científicos e intelectuales más influyentes e icónicos. de todos los tiempos. Un premio Nobel alemán-suizo, Einstein es a menudo considerado como el padre de la física moderna. [2] 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 del efecto fotoeléctrico". [3]
Como han dicho otros, un enfoque es usar 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§ion=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:]
Recibirás el texto sin procesar, 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.
Escribí una biblioteca de Python que pretende hacer esto muy fácil. Compruébalo en Github .
Para instalarlo, ejecuta
$ pip install wikipedia
Luego, para obtener el primer párrafo de un artículo, simplemente use la función wikipedia.summary
.
>>> import wikipedia
>>> print wikipedia.summary("Albert Einstein", sentences=2)
huellas dactilares
Albert Einstein (/ ælbərt aɪnstaɪn /; alemán: [albɐt aɪnʃtaɪn] (escuchar); 14 de marzo de 1879 - 18 de abril de 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 del efecto fotoeléctrico ".
En cuanto a cómo funciona, wikipedia
realiza una solicitud a la extensión de la interfaz móvil de MediaWiki API, que devuelve versiones amigables para dispositivos 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 exsentences
, limitan el número de caracteres y oraciones devueltos por la API.
Hace un tiempo, hice dos clases para obtener artículos de Wikipedia en texto sin formato. Sé que no son la mejor solución, pero puedes adaptarla a tus necesidades:
Puedes usarlo así:
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
La relativamente nueva API REST tiene un método de summary
que es perfecto para este uso, y hace muchas de las cosas mencionadas en las otras respuestas aquí (por ejemplo, eliminar wikicode). Incluso incluye una imagen y geocoordinates, si corresponde.
Usando el encantador módulo de requests
y Python 3:
import requests
r = requests.get("https://en.wikipedia.org/api/rest_v1/page/summary/Amsterdam")
page = r.json()
print(page["extract"]) # Returns ''Amsterdam is the capital and...''
Lo que hice fue esto:
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
Primero, prometo que no estoy siendo sarcástico.
Aquí hay una pregunta anterior que podría ser útil: Obtener un artículo de Wikipedia con Python
En esto, alguien sugiere usar la API de alto nivel de wikipedia, lo que lleva a esta pregunta:
Pruebe el pattern
.
pip install pattern
from pattern.web import Wikipedia
article = Wikipedia(language="af").search(''Kaapstad'', throttle=10)
print article.string
Pruebe una combinación de urllib
para buscar el sitio y BeautifulSoup
o lxml
para analizar los datos.
Si quiere sugerencias de la biblioteca, urllib2 viene a la mente BeautifulSoup , urllib2 . Respondió en SO antes: Web raspado con 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/
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 N oraciones y / o solo la introducción, como HTML o texto sin formato.
Esta es la llamada de API que desea realizar, pruébelo: 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) oraciones = 2, (ex) intro =, (ex) texto sin formato, son parámetros del módulo (vea el primer enlace para su documento API) pidiendo dos oraciones de la introducción como texto sin formato; deje este último para HTML.
-
redirects=
(true) así que si pides "titles = Einstein" obtendrás la información de la página de Albert Einstein -
formatversion=2
para un formato más limpio en UTF-8.
Hay 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.
La información de la página en los resultados de búsqueda trata de obtener este extracto de texto, junto con obtener una descripción y una imagen principal para los artículos.