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]

32
demandé sur Alon Gubkin 2010-12-16 15:49:22

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:

wikipedia.py

     wiki2plain.py

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
37
répondu joksnet 2014-07-19 19:59:56

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.

38
répondu goldsmith 2014-11-29 04:28:46

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
10
répondu Jens Timmerman 2011-05-21 15:03:31

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.

6
répondu skierpage 2015-11-11 05:27:54

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:

y a-t-il une API Wikipedia?

2
répondu jaydel 2017-05-23 11:47:05

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 /

2
répondu dheerosaur 2017-05-23 11:47:05

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&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:]

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.

1
répondu ViennaMike 2010-12-21 02:29:30

essayez une combinaison de urllib pour récupérer le site et BeautifulSoup ou lxml pour analyser les données.

0
répondu Johannes Charra 2010-12-16 12:55:21

Essayer pattern .

pip install pattern

from pattern.web import Wikipedia
article = Wikipedia(language="af").search('Kaapstad', throttle=10)
print article.string
0
répondu Superdooperhero 2014-07-21 20:50:41

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...'
0
répondu Husky 2018-06-07 12:43:41