it-swarm.com.de

Extrahieren Sie den ersten Absatz aus einem Wikipedia-Artikel (Python).

Wie kann ich den ersten Absatz aus einem Wikipedia-Artikel mit Python extrahieren?

Zum Beispiel für Albert Einstein wäre das:

Albert Einstein war ein theoretischer Physiker. (Hören); 14. März 1879 - 18. April 1955) war ein theoretischer Physiker. Philosoph und Autor, der weit verbreitet ist als einer der am meisten angesehen einflussreiche und ikonische Wissenschaftler und Intellektuelle aller Zeiten. EIN Deutsch-Schweizer Nobelpreisträger Einstein wird oft als der Vater von .__ angesehen. moderne Physik. [2] Er erhielt die 1921 Nobelpreis für Physik "für seine Leistungen in der theoretischen Physik und insbesondere für seine Entdeckung des Gesetzes des photoelektrischen Effekts".

33
Alon Gubkin

Vor einiger Zeit habe ich zwei Klassen für Wikipedia-Artikel im Klartext erstellt. Ich weiß, dass sie nicht die beste Lösung sind, aber Sie können sie an Ihre Bedürfnisse anpassen:

wikipedia.py
wiki2plain.py

Sie können es so verwenden:

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

Ich habe eine Python-Bibliothek geschrieben, die dies sehr einfach machen soll. Schau es dir unter Github an.

Um es zu installieren, führen Sie es aus

$ pip install wikipedia

Um den ersten Absatz eines Artikels zu erhalten, verwenden Sie einfach die wikipedia.summary-Funktion. 

>>> import wikipedia
>>> print wikipedia.summary("Albert Einstein", sentences=2)

druckt

Albert Einstein (/ ˈælbərt ˈaɪnstaɪn/deutsch: [ˈalbɐt ˈaɪnʃtaɪn] (___ listen); 14. März 1879 - 18. April 1955) war in Deutschland geboren theoretischer Physiker, der die allgemeine Relativitätstheorie entwickelte, eine der zwei Säulen der modernen Physik (neben der Quantenmechanik Mechanik). Am bekanntesten für seine Masse-Energie-Äquivalenzformel E = mc2 (die als "berühmteste Gleichung der Welt" bezeichnet wurde) erhielt er 1921 den Nobelpreis für Physik "für seine Verdienste um die theoretische Physik und insbesondere für seine Entdeckung des Gesetzes der photoelektrischen Wirkung ".

Was die Funktionsweise angeht, fordert wikipedia eine Anfrage an die Mobile Frontend-Erweiterung der MediaWiki-API, die mobile Versionen von Wikipedia-Artikeln zurückgibt. Genauer gesagt: Durch Übergeben der Parameter prop=extracts&exsectionformat=plain analysieren die MediaWiki-Server den Wikitext und geben eine Nur-Text-Zusammenfassung des angeforderten Artikels zurück, einschließlich des gesamten Seitentextes. Es akzeptiert auch die Parameter exchars und exsentences, wodurch die Anzahl der von der API zurückgegebenen Zeichen und Sätze nicht überraschend begrenzt wird.

39
goldsmith

Was ich getan habe ist folgendes:

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 führt eine MediaWiki-Erweiterung aus, die genau diese Funktionalität als API-Modul bereitstellt. TextExtracts implementiert action=query&prop=extracts mit Optionen, um die ersten N -Sätze und/oder nur die Einführung als HTML oder Nur-Text zurückzugeben.

Versuchen Sie es mit dem gewünschten API-Aufruf: 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, um diese Informationen anzufordern
  • (ex) Sätze = 2, (Ex) Intro =, (Ex) Klartext, sind Parameter für das Modul (siehe erster Link für das API-Dokument), die zwei Sätze aus dem Intro als Klartext abfragen. lassen Sie letzteres für HTML aus.
  • redirects= (wahr) Wenn Sie also nach "Titel = Einstein" fragen, erhalten Sie die Albert-Einstein-Seiteninfo
  • formatversion=2 für ein saubereres Format in UTF-8.

Es gibt verschiedene Bibliotheken, die die MediaWiki-Aktions-API aufrufen, z. B. die in der Antwort von DGund, aber es ist nicht schwer, die API-Aufrufe selbst auszuführen.

Seiteninfo in Suchergebnissen beschreibt, wie dieser Textauszug zusammen mit einer Beschreibung und einem Leitbild für Artikel abgerufen wird.

8
skierpage

Wenn Sie Bibliotheksvorschläge haben möchten, kommen Sie auf BeautifulSoup , rllib2 . Beantwortet am SO vorher: Web Scraping mit Python .

Ich habe versucht, urllib2 eine Seite aus Wikipedia zu bekommen. Aber es war 403 (verboten). MediaWiki bietet eine API für Wikipedia, die verschiedene Ausgabeformate unterstützt. Ich habe keine Python-Wikitools verwendet, kann aber einen Versuch wert sein. http://code.google.com/p/python-wikitools/

2
dheerosaur

Erstens verspreche ich, dass ich nicht snarky bin.

Hier ist eine vorherige Frage, die von Nutzen sein könnte: Abrufen eines Wikipedia-Artikels mit Python

Hier schlägt jemand vor, die Wikipedia-API auf hoher Ebene zu verwenden, was zu dieser Frage führt:

Gibt es eine Wikipedia-API?

2
jaydel

Wie andere bereits gesagt haben, besteht ein Ansatz darin, die wikimedia-API und urllib oder urllib2 zu verwenden. Die folgenden Codefragmente gehören zu dem, was ich zum Extrahieren des sogenannten "Lead" -Abschnitts verwendet habe, der die Artikelzusammenfassung und die Infobox enthält. Dadurch wird geprüft, ob der zurückgegebene Text eine Weiterleitung anstelle des tatsächlichen Inhalts ist. Außerdem können Sie die Infobox überspringen, falls vorhanden (in meinem Fall habe ich anderen Code zum Herausziehen und Formatieren der Infobox verwendet. 

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

Sie erhalten den unformatierten Text einschließlich Wiki-Markup zurück, daher müssen Sie einige Aufräumarbeiten durchführen. Wenn Sie nur den ersten Absatz und nicht den gesamten ersten Abschnitt wünschen, suchen Sie nach dem ersten neuen Zeilenzeichen. 

1
ViennaMike

Versuchen Sie pattern.

pip install pattern

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

Die relativ neue REST - API verfügt über eine summary-Methode, die perfekt für diese Verwendung geeignet ist, und führt viele der in den anderen Antworten erwähnten Dinge aus (z. B. Entfernen von Wikicode). Es enthält sogar ein Bild und ggf. Geokoordinaten.

Mit dem reizvollen Modul requests und 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

Verwenden Sie eine Kombination aus urllib, um die Site abzurufen, und BeautifulSoup oder lxml, um die Daten zu analysieren.

0
Johannes Charra