Extrait le premier paragraphe d'un article de Wikipedia (Python)
Comment puis-je extraire le premier paragraphe d'un article de Wikipedia, en utilisant Python?
Par exemple, pour Albert Einstein , qui serait:
Albert Einstein (pronounced / ˈaɪnstaɪn/; allemand: [ˈalbɐt ˈaɪnʃtaɪn] (écouter); 14 mars 1879-18 avril 1955) était un physicien théoricien, philosophe et auteur, qui est largement considéré comme l'un des plus des scientifiques influents et emblématiques et les intellectuels de tous les temps. Un Prix Nobel germano-suisse, Einstein est souvent considéré comme le père de la physique moderne.[2] Il a reçu le 1921 Prix Nobel de physique " pour son services de Physique Théorique, et surtout pour sa découverte de l' la loi de l'effet photoélectrique".[3]
10 réponses
il y a quelque temps j'ai fait deux classes pour obtenir des articles Wikipédia en texte clair. Je sais que ce n'est pas la meilleure solution, mais vous pouvez l'adapter à vos besoins:
Vous pouvez l'utiliser comme ceci:
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
j'ai écrit une bibliothèque Python qui vise à rendre cela très facile. Vérifiez à Github .
pour l'installer, Lancez
$ pip install wikipedia
ensuite pour obtenir le premier paragraphe d'un article, il suffit d'utiliser la fonction wikipedia.summary
.
>>> import wikipedia
>>> print wikipedia.summary("Albert Einstein", sentences=2)
imprime
Albert Einstein (/ˈælbərt ˈaɪnstaɪn/; allemand: [ˈalbɐt ˈaɪnʃtaɪn] ( listen); 14 mars 1879-18 Avril 1955) était un allemand de naissance. physicien théorique qui a développé la théorie générale de la relativité, l'un des deux piliers de la physique moderne (à côté du quantique mécanique.) Bien que mieux connu pour sa formule d'équivalence masse–énergie E = mc2 (qui a été surnommé "l'équation la plus célèbre du monde"), il a reçu le prix Nobel de physique de 1921 "pour ses services à la physique théorique, et surtout pour sa découverte de la loi de l'effet photoélectrique".
en ce qui concerne son fonctionnement, wikipedia
fait une demande au Mobile Frontend Extension de L'API MediaWiki, qui renvoie des versions mobiles conviviales d'articles Wikipédia. Pour être précis, en passant les paramètres prop=extracts&exsectionformat=plain
, les serveurs MediaWiki analyseront le Wikitext et retourneront un résumé texte de l'article que vous demandez, jusqu'à et y compris le texte entier de la page. Il accepte également les paramètres exchars
et exsentences
, qui, sans surprise, limitent le nombre de caractères et de phrases retournés par L'API.
ce que j'ai fait est ceci:
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
Wikipedia exécute une extension MediaWiki qui fournit exactement cette fonctionnalité comme un module API. TextExtracts met en œuvre action=query&prop=extracts
avec des options de retour de la première N phrases et/ou tout simplement l'introduction, au format HTML ou texte brut.
Voici L'appel API que vous voulez faire, essayez-le: 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
pour demander cette information - (ex)sentences=2, (Ex)intro=, (ex)plaintext, sont des paramètres du module (voir le premier lien pour son API doc) demandant deux phrases de l'intro comme texte simple; laisser ce dernier pour HTML.
-
redirects=
(vrai) donc si vous demandez pour "titres=Einstein" vous obtiendrez L'Albert Einstein page info -
formatversion=2
pour un format propre au format UTF-8.
il y a plusieurs bibliothèques qui enveloppent l'invocation de L'API D'action MediaWiki, comme celle de la réponse de DGund, mais il n'est pas trop difficile de faire les appels D'API vous-même.
informations de Page dans les résultats de recherche discute obtenir cet extrait de texte, le long avec obtenir une description et une image de plomb pour les articles.
D'abord, je vous promets que je ne suis pas sarcastique.
Voici une question précédente qui pourrait être utile: Chercher un article de Wikipédia avec Python
dans ce quelqu'un suggère d'utiliser l'API de haut niveau de wikipedia, ce qui conduit à cette question:
si vous voulez des suggestions de bibliothèque, BeautifulSoup , urllib2 viennent à l'esprit. Répondu sur auparavant: Web scraping avec Python .
j'ai essayé urllib2 pour obtenir une page de Wikipedia. Mais, c'était 403 (Interdit). MediaWiki fournit une API pour Wikipedia, supportant différents formats de sortie. Je n'ai pas utilisé python-wikitools, mais peut être vaut la peine d'essayer. http://code.google.com/p/python-wikitools /
comme d'autres l'ont dit, une approche consiste à utiliser l'API et urllib ou urllib2 de wikimedia. Les fragments de code ci-dessous font partie de ce que j'ai utilisé pour extraire ce qu'on appelle la section "lead", qui contient l'abrégé de l'article et l'infobox. Ceci vérifiera si le texte retourné est une redirection au lieu du contenu réel, et vous permettra également de sauter l'infobox si présent (dans mon cas, j'ai utilisé un code différent pour sortir et formater l'infobox.
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:]
vous obtiendrez sauvegardez le texte brut, y compris le markup wiki, donc vous aurez besoin de faire un peu de nettoyage. Si vous voulez juste le premier paragraphe, pas toute la première section, cherchez le premier nouveau caractère de ligne.
essayez une combinaison de urllib
pour récupérer le site et BeautifulSoup
ou lxml
pour analyser les données.
Essayer pattern
.
pip install pattern
from pattern.web import Wikipedia
article = Wikipedia(language="af").search('Kaapstad', throttle=10)
print article.string
la relativement nouvelle REST API a une méthode summary
qui est parfaite pour cet usage, et fait beaucoup de choses mentionnées dans les autres réponses ici (par exemple supprimer wikicode). Il inclut même une image et géocoordonne s'il y a lieu.
utilisant le beau requests
module et 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...'