Script das ersten Satz von Wikipedia bersorgt

  • Hallo Leute,
    Ich bin auf der Suche nach einem Script, bei dem ich ein Stichwort eingeben kann und das dann automatisch die erste Zeile bzw. den ersten Satz von Wikipedia besorgt.
    Das heist ich gebe zB. "Raspberry Pi" ein und das Programm spuckt "Der Raspberry Pi ist ein kreditkartengroßer Einplatinencomputer, der von der britischen Raspberry Pi Foundation entwickelt wurde." aus. (http://de.wikipedia.org/wiki/Raspberry_Pi)

    Mit welcher Programmiersprache das Skript programmiert ist egal.

    Kennt jemand sowas, oder weiß jemand wie man so etwas realisieren könnte?
    Danke für eure Hilfe
    LG

  • Hallo Hans-Peter,

    was zunächst trivial klingt, stellt sich als gar nicht so einfach heraus.

    Was Du zunächst klären solltest:
    - Willst Du ein Script haben, das über die Konsole einen Begriff abfragt und eine entsprechende Wikipedia-Seite öffnet bzw. besser herunterlädt?
    - Oder willst Du ein Programm haben, das in einem Texteingabe-Feld den Begriff erwartet, die Seite öffnet und den Inhalt herunterlädt.

    Diese beiden Dinge sind in der Tat einfach.

    Eine Web-Seite kannst Du z,.B. mit folgendem Befehl herunterladen:

    Code
    wget http://de.wikipedia.org/wiki/Raspberry_Pi

    Wenn Du Dir dann den Inhalt anschaust, z.B. mit

    Code
    less Raspberry_Pi

    dann zeigt sich, dass das Ganze nicht so trivial ist, weil es keinen HTML-Tag für den "Ersten Satz" gibt. Das, was auf dem Bildschirm als erster Satz erscheint, ist tief in HTML-Strukturen vergraben.

    Code
    <p>Der <b>Raspberry Pi</b> ist ein <a href="/wiki/ISO_7810#ID-1" title="ISO 7810" class="mw-redirect">kreditkartengroÃ<9F>er</a> <a href="/wiki/Einplatinencomputer" title="Einplatinencomputer">Einplatinencomputer</a>, der von der <a href="/wiki/Vereinigtes_K%C3%B6nigreich" title="Vereinigtes Königreich">britischen</a> <i>Raspberry Pi Foundation</i> entwickelt wurde. Er kam Anfang 2012 auf den Markt, sein groÃ<9F>er Markterfolg wird teils als Revival des bis dahin weitgehend bedeutungslos gewordenen <a href="/wiki/Heimcomputer" title="Heimcomputer">Heimcomputers</a> zum <a href="/wiki/Programmieren" title="Programmieren" class="mw-redirect">Programmieren</a> und Experimentieren angesehen.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup></p>


    Bei dem Beispiel habe ich nichts entdeckt, wonach man gezielt suchen könnte, um den ersten Satz als Ergebnis erhalten zu können. Die Zeilen unmittelbar vor diesem Ausschnitt schließen HTML-Tags, die in ähnlicher Form zig-fach zuvor geöffnet und geschlossen wurden.

    Was Dir weiterhelfen könnte, ist ein Programm, dass die HTML-Struktur analysiert und alle HTML-Blöcke, die nicht zum dargestellten Text gehören, ausblendet.

    Selbst, wenn man unterstellt, dass der HTML-Tag "title" Bestandteil des ersten angezeigten Satzes sein sollte, wirst Du mit

    Code
    less Raspberry_Pi | grep title | head -n10

    nur so weit fündig, dass der 10. gezeigte Eintrag, den gewünschten ersten Satz enthält. Das ist allerdings nicht allgemeingültig.

    Vielleicht hat jemand anders eine Idee - oder wir befruchten uns hier gegenseitig...


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (28. Juni 2014 um 10:59)


  • Bei dem Beispiel habe ich nichts entdeckt, wonach man gezielt suchen könnte, um den ersten Satz als Ergebnis erhalten zu können.

    Bei diesem Beispiel könnte man einfach mit dem Punkt als Satzzeichen, das diesen Satz beendet arbeiten. Leider ist das nicht bei allen Beispielen so trivial, da oft Abkürzungen wie "bzw." im ersten Satz enthalten sind, die diese Art der "Satzextraktion" verhindern.
    Da wikipedia auf wikimedia basiert, kann man auch analog dazu die API verwenden. Wikipedia stellt auch eine API sandbox, mit der man direkt im Browser etwas experimentieren kann. Es gibt zwar einen Parameter "exsentences", mit dem sich die anzuzeigenden Sätze festlegen lassen, dieser scheint aber auch auf dem "Punkt" zu basieren und liefert daher abgeschnittene Sätze. Hier mal ein Beispiel zum Thema "Kulturapfel". Wie man sehen kann wird nach dem "Syn." die Rückgabe beendet.

    Ich finde gerade keine Möglichkeit, den ersten Satz sauber zurückzugeben :huh:

    Einmal editiert, zuletzt von freibeuter (28. Juni 2014 um 11:24)

  • Versucht doch mal dieses:

    Code
    wget http://de.wikipedia.org/wiki/Raspberry_Pi
    grep -m 1 "<p>" Raspberry_Pi | sed "s|<[^<]*>||g"

    Wenn das [1] noch stört auch:

    Code
    wget http://de.wikipedia.org/wiki/Raspberry_Pi
    grep -m 1 "<p>" Raspberry_Pi | sed "s|<[^<]*>||g" | sed "s|\[.*\]||g"

    Keep it simple [,&] stupid

  • Hallo zusammen,
    @hans-peter:
    es ist schwierig, für etwas eine 'Regel' zu erstellen, wenn dieses Etwas nicht 'konstant' ist bzw. der Aufbau der Seite sich immer unterscheidet. Ich habe mich an die Beispiele 'Raspberry_Pi' und 'Kulturapfel' gehalten. Dort kristallisiert sich zumindest heraus, dass die erste Textzeile wohl in einem <p>-Tag eingeschlossen ist. Es ist aber nicht immer der erste <p>-Tag (siehe 'Kulturapfel'). Ich habe es derart gelöst, dass der Inhalt des <p>-Tags mehr als 100 Zeichen enthalten muß.
    Hier einmal auf die Schnelle ein Python-Skript:

    Viel Glück !

    so long
    Perlchamp

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Aber auch das funktioniert nicht zu 100%.

    Beim Beispiel "Regexp" wird der ganze erste Absatz ausgegeben. Man könnte jetzt z.B. mit cut nur den ersten Satz herausfiltern. Dann hat man aber Probleme, wenn im ersten Satz eine Abkürzung steht.

    Und beim Beispiel Volkswagen hat der erste Satz nur 65 Zeichen.

    Keep it simple [,&] stupid

  • Sorry, ich hab noch eine kleine Zwischenfrage:
    wenn ich das script aufrufe kommt dieser Fehler:

    Python
    Traceback (most recent call last):
      File "main.py", line 5, in <module>
        from urllib.request import *
    ImportError: No module named request

    Muss ich urllib noch irgendwie installieren?

  • kungel:
    ich habe auch nicht behauptet, dass dies zu 100% funktioniert. Und es wird immer Seiten geben, die nicht funktionieren, da das Wiki nun mal nicht einheitlich ist ! (und bei der Eingabe muss man ein Leerzeichen durch einen Unterstrich ersetzen, und und und ... - muß man halt probieren ...)

    Zitat


    Und beim Beispiel Volkswagen hat der erste Satz nur 65 Zeichen.


    =>

    Code
    if len(p) > 60 :
    Zitat


    Beim Beispiel "Regexp" wird der ganze erste Absatz ausgegeben.


    =>
    z.B: (aber ist das sooo wichtig ? - sollte nicht zusammenbleiben, was zusammengehört ?)

    Code
    print(ausgabe[0][:300], '...')

    @hans-peter:
    ist ein Standard-Modul (du hast Python3.2?, alles auch upgedatet und upgegradet?)

    Viel Glück !

    so long
    Perlchamp

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • Sorry mein Fehler, hatte es nicht mit "python wiki.py" gestartet. Jetzt klappt alles (So aufrufen "python3 wiki.py").
    Danke für eure Hilfe, dass ist ja schon ne ganze menge.
    Werde mal ein wenig rumbasteln.
    Ich lass das Thema her noch offen, falls jemand noch eine Idee hat...
    Aber erstmal Vielen Dank für eure Hilfe!!

  • So ein "Scraping" ist ein ziemlich komplexes Thema. Ich habe eine Professionelle Anwendung zu dem Thema bzw. der Content Erstellung entwickelt und genau dieses Scrapen hat ca. 60% des Gesamtaufwands dabei verursacht (weil man da auch auf x-beliebige Webseiten gehen kann und man ga rnicht glaubt, was das stellenweise für ein unsauberer HTML-Schei... zusammengefrickelt ist).

    Der Ansatz der "Bewertung" mit "muss mindestens xy" Zeichen haben ist schon ganz gut. Sollte allerdings noch erweitert werden um das Keyword selbst.

    Man kann (bzw. muss eigentlich) mehrstufig vorgehen:

    • Zerschnippeln der Seite in die einzelnen HTML-Bestandteile (P)
    • Alles rausschmeissen, was nicht mindestens x Zeichen oder Wörter lang ist.
    • Jetzt schauen, wo das Suchwort enthalten ist und ausgeben lassen.

    Einmal editiert, zuletzt von Igotcha (29. Juni 2014 um 01:03)

  • Das will ich wohl glauben, wie komplex das Thema ist. Schon die genannten Wiki-Seiten zeigen, wie versteckt der über den Browser gut lesbare Text ist.

    Trotzdem will ich noch ein bischen rummäkeln:
    Aufgabenstellung ist, die 1. Zeile anzuzeigen (oder auch 1. Absatz)

    Beispiel "Kulturapfel" zeigt, dass das 1. p-Tag nicht immer die 1. Zeile ist.
    Hier hat sich zufällig(?) ein Bild vorgemogelt.

    Beispiel "Volkswagen" zeigt, dass die 1. Zeile auch relativ kurz sein kann.
    Einfach die Länge auf 60 setzen reicht auch nicht. Man schaue sich die 1. Bildunterschrift zu "Leutheusser-Schnarrenberger" an: satte 110 Zeichen.

    Zusätzlich noch das Suchwort nehmen, hilft auch nicht. In vielen Beispielen ist im obersten Bild das Suchwort auch vorhanden, siehe "Kulturapfel"

    Es fehlt noch ein weiteres Kriterium.

    Ich habe mir die Wiki-Seiten noch mal angeschaut. Was mir noch aufgefallen ist, dass das Suchwort in im 1. Absatz fett gedruckt wird, also mit dem Tag "<b>"

    Es geht vielleicht Folgendes (in einem bash-script, Kulturapfel nach Wunsch ersetzen)

    Code
    wget http://de.wikipedia.org/wiki/Kulturapfel
    grep "<p>" Kulturapfel | grep -m 1 "<b>" | sed "s|<[^<]*>||g"

    Warte auf Gegenbeispiele

    Edit (just for fun):
    Als Einzeiler:

    Code
    wget -q -O - http://de.wikipedia.org/wiki/Kulturapfel | grep "<p>" | grep -m 1 "<b>" | sed "s|<[^<]*>||g"

    Ist zwar nicht die Frage, aber mit lynx kann man sich die HTML-Seite auch als Textdatei holen.

    Code
    lynx -dump http://de.wikipedia.org/wiki/Kulturapfel > Kulturapfel.txt

    Keep it simple [,&] stupid

    Einmal editiert, zuletzt von kungel (29. Juni 2014 um 11:13)

  • Solche Abfragen und Anzeigen sind kein Hexenwerk und Ihr werdet ganz schön kompliziert. Also um solch ein Problem anzugehen nutzt man die Wikipedia-API. Die bietet Schnittstellen an mit der man das ganz einfach umsetzen kann. Und will man wirklich nur den 1. Satz dann nimmt man den String vor dem 1. Punkt wie es hier schon beschrieben wurde.

  • Deswegen macht auch kein Mensch sowas. Das mit dem Punkt war natürlich zu kurz gedacht. Zusammenfassend: Ist der Satzbau nicht schon im Dokument markiert (z.b. duch Steuerzeichen), gibt es keine zuverlässige Lösung, den 1. Satz eindeutig herauszufiltern.

    Also Anzahl von Zeichen nehmen und dann ein ... dranhängen ist wohl eleganter.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!