Comment puis-je extraire le premier paragraphe d'un article Wikipedia en utilisant Python?
Par exemple, pour Albert Einstein , ce serait:
Albert Einstein (prononcé /ˈælbərt ˈAɪnstaɪn /; allemand: [ˈalbɐt ˈaɪnʃtan] (Écoute); 14 mars 1879 - 18 avril 1955) était un physicien théoricien, philosophe et auteur qui est largement considéré comme l'un des plus scientifiques influents et emblématiques et intellectuels de tous les temps. UNE Prix Nobel germano-suisse, Einstein est souvent considéré comme le père de physique moderne. [2] Il a reçu le Prix Nobel de physique de 1921 "pour ses services à la physique théorique et notamment pour sa découverte de la loi de l'effet photoélectrique". [3]
Il y a quelque temps, j'ai créé deux classes pour obtenir des articles Wikipedia en texte brut. Je sais qu'ils ne sont 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. Découvrez-le à Github .
Pour l'installer, lancez
$ pip install wikipedia
Ensuite, pour obtenir le premier paragraphe d'un article, utilisez simplement la fonction wikipedia.summary
.
>>> import wikipedia
>>> print wikipedia.summary("Albert Einstein", sentences=2)
empreintes
Albert Einstein (/ ˈælbərt aɪnstaɪn /; allemand: [ˈalbɐt ˈaɪnʃtan] ( Écouter); 14 mars 1879 - 18 avril 1955) est né en Allemagne 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é de la mécanique quantique ). Bien que plus connu pour sa formule d'équivalence masse-énergie E = mc2 (surnommé "l'équation la plus célèbre du monde"), il a reçu le prix Nobel de physique de 1921 "pour ses services rendus à la physique théorique, et plus particulièrement pour sa découverte de la loi de l'effet photoélectrique ".
En ce qui concerne son fonctionnement, wikipedia
adresse une requête à Mobile Frontend Extension de l’API MediaWiki, qui renvoie des versions adaptées aux appareils mobiles des articles de Wikipedia. Pour être plus précis, en passant les paramètres prop=extracts&exsectionformat=plain
, les serveurs MediaWiki analyseront le Wikitext et renverront un résumé en texte brut de l’article que vous demandez, y compris le texte intégral de la page. Il accepte également les paramètres exchars
et exsentences
, qui limitent naturellement le nombre de caractères et de phrases renvoyés par l'API.
Voici ce que j'ai fait:
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é en tant que module d'API. TextExtracts implémente action=query&prop=extracts
avec des options permettant de renvoyer les premières phrases N et/ou seulement l'introduction, sous forme de texte HTML ou brut.
Voici l'appel de l'API que vous voulez faire, essayez-le: https://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Albert%20Einstein&exinents=2&explaintext=&redirects= & formatversion = 2
action=query&prop=extracts
pour demander cette informationredirects=
(true) donc si vous demandez "Titres = Einstein", vous obtiendrez les informations de la page Albert Einsteinformatversion=2
pour un format plus propre en UTF-8.Plusieurs bibliothèques encapsulent l'appel de l'API d'action MediaWiki, telle que celle figurant dans 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 } _ explique comment obtenir cet extrait de texte, ainsi qu'une description et une image principale pour les articles.
Si vous voulez des suggestions de bibliothèques, BeautifulSoup , urllib2 viens à l'esprit ..__ Répondu le SO avant: Web raclant avec Python .
J'ai essayé urllib2 pour obtenir une page de Wikipedia. Mais c'était 403 (interdit). MediaWiki fournit une API pour Wikipedia, prenant en charge divers formats de sortie. Je n'ai pas utilisé python-wikitools, mais cela vaut peut-être la peine d'essayer. http://code.google.com/p/python-wikitools/
Premièrement, je vous promets que je ne suis pas sournois.
Voici une question précédente qui pourrait être utile: Récupérer un article Wikipedia avec Python
Dans ce document, quelqu'un suggère d'utiliser l'API de haut niveau wikipedia, ce qui conduit à cette question:
Comme d'autres l'ont dit, une approche consiste à utiliser l'API wikimedia et urllib ou urllib2. Les fragments de code ci-dessous font partie de ce que j'ai utilisé pour extraire ce que l'on appelle la section "lead", qui contient le résumé de l'article et l'infobox. Cela vérifiera si le texte renvoyé est une redirection au lieu du contenu réel, et vous permettra également de sauter l’infobox si elle est présente (dans mon cas, j’ai utilisé un code différent pour extraire 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 le texte brut, y compris le balisage wiki, de sorte que vous devrez nettoyer. Si vous voulez juste le premier paragraphe, pas la première section, cherchez le premier caractère de la nouvelle ligne.
Essayez pattern
.
pip install pattern
from pattern.web import Wikipedia
article = Wikipedia(language="af").search('Kaapstad', throttle=10)
print article.string
L'API relativement nouvelle REST a une méthode summary
parfaitement adaptée à cet usage et remplissant de nombreuses fonctions mentionnées dans les autres réponses ici (par exemple, supprimer le code wiki). Il inclut même une image et des coordonnées géographiques, le cas échéant.
Utilisation du charmant module requests
et de 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...'
Essayez une combinaison de urllib
pour extraire le site et de BeautifulSoup
ou lxml
pour analyser les données.