2009-07-18 4 views
22

Ich versuche, einen verallgemeinerten HTML-Parser zu erstellen, der gut auf Blog-Posts funktioniert. Ich möchte meinen Parser auf die URL des spezifischen Entries verweisen und einen sauberen Text des Posts selbst erhalten. Mein grundlegender Ansatz (von Python) bestand darin, eine Kombination aus BeautifulSoup/Urllib2 zu verwenden, was in Ordnung ist, aber es setzt voraus, dass Sie die richtigen Tags für den Blogeintrag kennen. Hat jemand bessere Ideen?Großen Parser erstellen - Relevanten Text aus HTML/Blogs extrahieren

Hier sind einige Gedanken, vielleicht könnte jemand erweitern, dass ich nicht genug Wissen/Know-how noch zu implementieren habe.

  1. Das Unix-Programm ‚Luchs‘ scheint besonders gut Blog-Posts zu analysieren - was Parser verwenden sie, oder wie diese genutzt werden könnte?

  2. Gibt es Dienste/Parser, die automatisch Junk-Anzeigen usw. entfernen?

  3. In diesem Fall hatte ich eine vage Vorstellung, dass es eine gute Annahme sein kann, dass Blogposts normalerweise in einem bestimmten definierenden Tag mit class = "entry" oder ähnlichem enthalten sind. Daher ist es möglich, einen Algorithmus zu erstellen, der die umschließenden Tags mit dem saubersten Text zwischen ihnen findet - irgendwelche Ideen dazu?

Vielen Dank!

+1

Lynx verwendet einen eigenen Tagsoup-Parser. Der Quellcode ist verfügbar. – Quentin

Antwort

24

Junge, habe ich die perfekte Lösung für Sie.

Arc90 Lesbarkeit Algorithmus genau dies. Bei gegebenem HTML-Inhalt wird der Inhalt des Hauptblogposttexts ausgewählt, Kopfzeilen, Fußzeilen, Navigation usw. ignoriert.

Hier sind Implementierungen in:

Ich werde in ein paar Tagen einen Perl-Port zu CPAN freigeben. Fertig.

Hoffe, das hilft!

+0

Es stellte sich heraus, dass dies wirklich gut funktioniert - benötigt, um ein paar Änderungen vorzunehmen, um es besser zu machen (Wechsel zu SGML-Parser anstelle von HTMLParser in beautifulsoup), aber was für eine großartige Lösung! Danke –

+0

Eine kurze Anmerkung: Arc90s Lesbarkeits-Tool hat einige Schwachstellen. Auf einer komplexen Seite wie dieser (http://blog.moertel.com/articles/2007/02/22/a-simple-directory-tree-printer-in-haskell), lässt es die meisten Codeblöcke stillschweigend fallen. Das ist ein signifikantes Problem, wenn Sie es verwenden werden, um Informationen aus _coding_-Blogs zu extrahieren. – Telemachus

+0

Danke für die Python- und PHP-Links, ich wusste nicht, dass diese existierten. –

3

Es gibt Projekte, die speziell das "Rauschen" einer bestimmten Seite herausfiltern. In der Regel geschieht dies dadurch, dass dem Algorithmus einige Beispiele für einen bestimmten Seitentyp gegeben werden und er sich ansehen kann, welche Teile sich nicht zwischen ihnen ändern. Davon abgesehen, müssten Sie dem Algorithmus ein paar Beispielseiten/Beiträge von für jeden Blog geben, den Sie analysieren möchten (). Dies funktioniert in der Regel gut, wenn Sie einen kleinen definierten Satz von Websites haben, die Sie crawlen werden (z. B. Nachrichtenwebsites). Der Algorithmus erkennt im Grunde die Vorlage, die sie in HTML verwenden, und wählt den interessanten Teil aus. Es gibt keine Magie hier, es ist hart und unvollkommen.

Ein gutes Beispiel für diesen Algorithmus finden Sie im Quellcode von EveryBlock.com, der nur Open Source war. Gehen Sie zu everyblock.com/code und laden Sie das Paket "ebdata" herunter und sehen Sie sich das Modul "templateamaker" an.

Und ich will nicht das Offensichtliche sagen, aber haben Sie überlegt, nur RSS aus den betreffenden Blogs zu verwenden? Normalerweise enthalten die Felder den gesamten Blogpost, Titel und andere Metainformationen zusammen mit ihnen. Die Verwendung von RSS wird viel einfacher als die vorherige Lösung, die ich erwähnt habe.

+0

Ja, ich habe tatsächlich die RSS-Daten, das Problem ist, dass viele nicht den vollen Text haben, und ich brauche es in jedem Fall. Überprüfen Sie das jetzt, danke. –