web-dev-qa-db-fra.com

Extraire le premier paragraphe d'un article Wikipedia (Python)

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]

33
Alon Gubkin

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:

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
38
joksnet

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.

39
goldsmith

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
10
Jens Timmerman

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 information
  • (ex) phrases = 2, (ex) intro =, (ex) texte en clair, sont des paramètres du module (voir le premier lien pour son document API) demandant deux phrases de l'intro sous forme de texte brut; laisser ce dernier pour HTML.
  • redirects= (true) donc si vous demandez "Titres = Einstein", vous obtiendrez les informations de la page Albert Einstein
  • formatversion=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.

8
skierpage

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/

2
dheerosaur

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:

Y a-t-il une API Wikipedia?

2
jaydel

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&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 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. 

1
ViennaMike

Essayez pattern.

pip install pattern

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

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...'
0
Husky

Essayez une combinaison de urllib pour extraire le site et de BeautifulSoup ou lxml pour analyser les données.

0
Johannes Charra