HTML parsen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gerenuk
User
Beiträge: 69
Registriert: Donnerstag 21. Januar 2010, 22:27

Hallo!
ich möchte ein Programm schreiben mit dem ich schnell Informationen aus Internet-HTMLs in eine Datenbank hineinparsen kann. Zum Beispiel steht da irgendwie eine Publikation da mit Title, Autor usw. Ich schaue mir die Seite an, sage dem Programm wo was steht und er parst mir viele solcher Seiten.

Was würde ich dafür am besten nehmen? Ich habe von Schlagwörtern wie DOM, XPath, gehört aber weiß jetzt gar nicht was genau ich brauche. Meist möchte ich HTMLs parsen (also keine XML?) wie z.B.
http://elibrary.ru/item.asp?id=13367824
Welcher Python parser eignet sich?
Kann mir da jemand den Weg weisen?

PS: und kann ich in Firefox das Parsen irgendwie mit einem Klick anstoßen?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Da würde sich zum Beispiel `lxml.html` empfehlen (http://lxml.de/). Und irgend eine Eventlibrary, damit das Ganze auch noch mächtig abgeht. (gevent o.ä.)
Gerenuk
User
Beiträge: 69
Registriert: Donnerstag 21. Januar 2010, 22:27

Was sind/machen denn Eventlibraries? :)
Ich will ja nur parsen?
BlackJack

@Gerenuk: Die beiden verbreitetsten Bibliotheken dafür sind `BeautifulSoup` und `lxml.html`. Das erste ist schon etwas älter aber dafür *ein* Modul in reinem Python. `lxml.html` ist schneller und bietet zusätzlich zur ElementTree-API noch XPath und CSS-Selektoren um Elemente zu suchen. Ist dafür ein ganzes Paket mit Abhängigkeiten und in C geschriebenen Modulen. Wenn Du die Wahl hast, solltest Du `lxml.html` nehmen.

Die Frage nach Firefox verstehe ich nicht so ganz? FF kann kein Python, also müsstest Du da schon ein Plugion für schreiben. Vielleicht gibt es ja auch bereits eines mit dem man Kontextmenü-Einträge erstellen kann, die ein beliebiges Skript starten können und dem zum Beispiel das dargestellte Dokument oder zumindest die URL übergeben können.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Gerenuk hat geschrieben:Was sind/machen denn Eventlibraries? :)
Ich will ja nur parsen?
Die generelle Bedeutung von Event-Libraries solltest du dir vielleicht in einschlägigen Wissenquellen oder auf den Websites von den Libraries zu Gemüte führen; hier aber mal für deinen konkreten Anwendungsfall was dir das nutzen könnte: Ich vermute mal, dass dein Crawler "schnell" arbeiten soll im Sinne voll "möglichst viele Websites pro Sekunde crawlen". Wenn du jetzt eine nach der anderen abarbeitest, geht die meiste Zeit dabei verloren, auf die Antwort der Webserver zu warten. Eine Lösung wären Threads, allerdings würde das spätestens ab ein paar Hundert davon ziemlich eklig was Speicher- und CPU-Aufwand angeht. So ein Framework erlaubt dir sogenanntes "event-driven programming", d.h. du programmierst so, dass nicht du auf die Antwort wartest, sondern auf die Antwort reagierst sobald sie da ist. Damit geht viel weniger Zeit beim Warten auf Antworten verloren. Viele diese Eventlibraries erlauben es, diese Vorteile zu genießen, ohne dein Programm komplett neu zu konzipieren, deswegen empfehle ich umbedingt, sowas zu nutzen, sollte dein Crawler mehr als 10 Seiten pro Minute crawlen wollen :)
Gerenuk
User
Beiträge: 69
Registriert: Donnerstag 21. Januar 2010, 22:27

Oh, das hört sich schon ziemlich fortgeschritten an :)
Also für den Anfang wollte ich gar nicht so sehr crawlen, sondern erstmal per Hand auf die jeweiligen Seiten gehen und diese dann einlesen ohne etwas guttenborgen zu müssen. Ob man dann später die Suchmenge crawlt kann ich dann später angehen.

Das mit dem Firefox war eher eine Zusatzfrage. Vielleicht hat ja jemand eine Idee wie man das Skript komfortabel einbinden kann (ohne sich viel anlesen zu müssen). So Greasemonkey oder sowas in der Art.
Zuletzt geändert von Gerenuk am Mittwoch 16. März 2011, 14:20, insgesamt 1-mal geändert.
Gerenuk
User
Beiträge: 69
Registriert: Donnerstag 21. Januar 2010, 22:27

Und wie würde ich am geschicktesten die jeweilige Position schnell einstellen wo der erforderliche Text steht? Ist das das DOM Zeug? Eventuell will ich ja auch viele andere Quellen auswerten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Naja, BlackJack hat ja schon CSS-Selektoren und XPath genannt. Du könntest zu jeder Webseite eine passende Datenstruktur anlegen, die ein Element und den Selektor dafür hinterlegt:

Code: Alles auswählen

hosts = {
    "www.foo.bar": [
        {"author": "XPath-Ausdruck"},
        {"title": "..."},
        {...}
    ]
}
Solltest Du XPath und CSS-Selektoren mischen wollen, brauchst Du halt noch eine Unterscheidung.

Du kannst also entsprechend der URL den Quellcode einlesen und die einzelnen gesuchten Knoten durchgehen und entsprechend auslesen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Gerenuk: Zum Analysieren der Seiten ist die Firefox-Erweiterung Firebug sehr hilfreich. Damit lassen sich relativ leicht die Elemente in der Seite identifizieren und der Pfad dort hin als XPath oder CSS-Selektor in die Zwischenablage kopieren.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Generell sollte man noch sagen, dass es nicht unbedingt zulässig ist, was du vorhast.
Du versuchst hier, fremde Datenbanken auszulesen.
Die meisten Anbieter verbieten das.
Das Internet ist ja kein rechtsfreier Raum!
Antworten