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?
HTML parsen
-
- 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: 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.
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.
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
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 hat geschrieben:Was sind/machen denn Eventlibraries? :)
Ich will ja nur parsen?
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.
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.
- 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:
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.
Code: Alles auswählen
hosts = {
"www.foo.bar": [
{"author": "XPath-Ausdruck"},
{"title": "..."},
{...}
]
}
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
assert encoding_kapiert
@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.
- 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!
Du versuchst hier, fremde Datenbanken auszulesen.
Die meisten Anbieter verbieten das.
Das Internet ist ja kein rechtsfreier Raum!