“Smarte” Art, Website-Daten zu analysieren und zu verwenden?

Lesezeit: 7 Minuten

Benutzer-Avatar
Blaubit

Wie parst man auf intelligente Weise Daten, die von Suchergebnissen auf einer Seite zurückgegeben werden?

Angenommen, ich möchte einen Webdienst erstellen, der nach Online-Büchern sucht, indem er die Suchergebnisse der Websites vieler Buchanbieter analysiert. Ich könnte die rohen HTML-Daten der Seite abrufen und einige Regexs ausführen, damit die Daten für meinen Webdienst funktionieren, aber wenn eine der Websites die Formatierung der Seiten ändert, bricht mein Code!

RSS ist in der Tat eine wunderbare Option, aber viele Websites haben keine XML/JSON-basierte Suche.

Gibt es Kits, die dabei helfen, Informationen automatisch auf Seiten zu verbreiten? Eine verrückte Idee wäre, ein Fuzzy-KI-Modul Muster auf einer Suchergebnisseite erkennen und die Ergebnisse entsprechend parsen zu lassen …

  • was die sprache angeht, bin ich in php fortgeschritten, bin aber bereit, bei bedarf asp.net zu verwenden. danke für alle antworten!

    – Blaubit

    3. August 2009 um 17:30 Uhr

  • Ein guter regulärer Ausdruck kann überraschend flexibel und tolerant in der Verwendung sein. Eine gute Technik besteht darin, einen Bereich abzugleichen Vor ein Datenelement, fügen Sie die Daten dann in eine Erfassungsgruppe mit einem Lazy Quantifier ein und passen Sie dann einen Bereich an nach die Daten. Wenn Sie die Vorher/Nachher-Übereinstimmungen flexibel definieren, können sie sehr gut mit Änderungen in der Formatierung umgehen. www.regular-expressions.info bietet einige gute Erklärungen zu dieser und anderen Techniken.

    – BobMcGee

    3. August 2009 um 18:34 Uhr

Benutzer-Avatar
Bob McGee

Ich habe einiges davon vor kurzem getan, und hier sind meine Erfahrungen.

Es gibt drei grundlegende Ansätze:

  1. Reguläre Ausdrücke.
    • Am flexibelsten, am einfachsten zu verwenden mit locker strukturierten Informationen und wechselnden Formaten.
    • Schwieriger ist die Struktur-/Tag-Analyse, aber einfacher der Textabgleich.
    • Eingebaute Validierung der Datenformatierung.
    • Schwieriger zu pflegen als andere, da Sie für jedes Muster, das Sie zum Extrahieren/Umwandeln des Dokuments verwenden möchten, einen regulären Ausdruck schreiben müssen
    • Im Allgemeinen langsamer als 2 und 3.
    • Funktioniert gut für Listen ähnlich formatierter Elemente
    • Ein gutes Regex-Entwicklungs-/Test-Tool und einige Beispielseiten helfen dabei. Ich habe hier gute Dinge über RegexBuddy zu sagen. Probieren Sie ihre Demo aus.
    • Damit habe ich den größten Erfolg. Dank der Flexibilität können Sie mit fiesem, brutalem HTML-Code arbeiten.
  2. Konvertieren Sie HTML in XHTML und verwenden Sie XML-Extraktionstools. Bereinigen Sie HTML, konvertieren Sie es in legales XHTML und verwenden Sie XPath/XQuery/X-whatever, um es als XML-Daten abzufragen.
    • Tools: TagSoup, HTMLTidy usw
    • Die Qualität der HTML-zu-XHML-Konvertierung ist SEHR wichtig und sehr variabel.
    • Beste Lösung, wenn die gewünschten Daten durch das HTML-Layout und Tags strukturiert sind (Daten in HTML-Tabellen, Listen, DIV/SPAN-Gruppen usw.)
    • Am besten geeignet, um Linkstrukturen, verschachtelte Tabellen, Bilder, Listen usw. zu erhalten
    • Sollte schneller sein als Option 1, aber langsamer als Option 3.
    • Funktioniert gut, wenn sich die Inhaltsformatierung ändert/variabel ist, die Dokumentstruktur/das Layout jedoch nicht.
    • Wenn die Daten nicht durch HTML-Tags strukturiert sind, haben Sie Probleme.
    • Kann mit Option 1 verwendet werden.
  3. Parser-Generator (ANTLR usw.) — Erstellen Sie eine Grammatik zum Parsen und Analysieren der Seite.
    • Ich habe das nicht ausprobiert, weil es für meine (unordentlichen) Seiten nicht geeignet war
    • Am besten geeignet, wenn die HTML-Struktur stark strukturiert, sehr konstant und regelmäßig ist und sich nie ändert.
    • Verwenden Sie dies, wenn das Dokument leicht zu beschreibende Muster enthält, diese jedoch keine HTML-Tags beinhalten und Rekursionen oder komplexe Verhaltensweisen beinhalten
    • Erfordert keine XHTML-Eingabe
    • SCHNELLSTER Durchsatz im Allgemeinen
    • Große Lernkurve, aber einfacher zu warten

Ich habe mit gebastelt Web-Ernte für Option 2, aber ich finde ihre Syntax etwas seltsam. Mischung aus XML und einer Pseudo-Java-Skriptsprache. Wenn Sie Java und die Datenextraktion im XML-Stil (XPath, XQuery) mögen, könnte dies das Ticket für Sie sein.


Bearbeiten: Wenn Sie reguläre Ausdrücke verwenden, stellen Sie sicher, dass Sie eine Bibliothek mit faulen Quantifizierern und Erfassungsgruppen verwenden! Den älteren Regex-Bibliotheken von PHP fehlen diese, und sie sind unverzichtbar, um Daten zwischen Open/Close-Tags in HTML abzugleichen.

Ohne ein Fest HTML-Struktur zu parsen, würde ich es hassen, reguläre Ausdrücke zum Auffinden von Daten zu pflegen. Möglicherweise haben Sie mehr Glück, wenn Sie den HTML-Code mit einem geeigneten Parser analysieren, der den Baum erstellt. Wählen Sie dann Elemente aus … die besser wartbar wären.

Offensichtlich ist der beste Weg eine XML-Ausgabe der Engine mit einem festen Markup, das Sie analysieren und validieren können. Ich würde denken, dass eine HTML-Parsing-Bibliothek mit etwas “im Dunkeln” Sondieren des erzeugten Baums einfacher zu warten wäre als reguläre Ausdrücke.

Auf diese Weise müssen Sie nur einchecken <a href="https://stackoverflow.com/questions/1223458/blah" class="cache_link">... sich in etwas verwandeln <a href="https://stackoverflow.com/questions/1223458/blah" class="cache_result">... oder Wasauchimmer.

Unterm Strich wäre es düster, bestimmte Elemente mit Regexp zu erfassen. Ein besserer Ansatz besteht darin, ein DOM-ähnliches Modell der Seite zu erstellen und nach „Ankern“ für Zeichendaten in den Tags zu suchen.

Oder eine E-Mail senden zu der Seite, die einen Fall für eine XML-API angibt … Sie könnten eingestellt werden!

  • Reguläre Ausdrücke können gewartet werden, wenn sie richtig gemacht werden. Einige Geschmacksrichtungen erlauben eingebettete Kommentare, die sehr hilfreich sein können. Sie können auch Erfassungsgruppen und Lazy Quantifier verwenden, um Strukturelemente davor und danach abzugleichen und die Daten (mit Lazy Quantifier) ​​dazwischen zu erfassen. Verhält sich ähnlich wie DOM oder Tree Parsing, benötigt aber kein sauberes XML.

    – BobMcGee

    3. August 2009 um 19:14 Uhr

Sie sagen nicht, welche Sprache Sie verwenden. Im Java-Land können Sie verwenden TagSuppe und XPath, um den Schmerz zu minimieren. Es gibt ein Beispiel von dieses Blog (Natürlich kann der XPath je nach Bedarf viel komplizierter werden):

URL url = new URL("http://example.com");
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup
Document doc = builder.build(url);
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title");
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml");
String title = ((Element)titlePath.selectSingleNode(doc)).getText();
System.out.println("Title is "+title);

Ich würde empfehlen, die XPath-Ausdrücke zu externalisieren, damit Sie ein gewisses Maß an Schutz haben, wenn sich die Website ändert.

Hier ist ein Beispiel-XPath, das ich definitiv nicht zum Screenscrapen dieser Seite verwende. Auf keinen Fall, nicht ich:

"//h:div[contains(@class,'question-summary')]/h:div[@class="summary"]//h:h3"

Benutzer-Avatar
Jon Galloway

Sie haben nicht erwähnt, welchen Technologie-Stack Sie verwenden. Wenn Sie HTML analysieren, würde ich eine Parsing-Bibliothek verwenden:

Es gibt auch Webservices, die genau das tun, was Sie sagen – kommerziell und kostenlos. Sie scrapen Seiten und bieten Webservice-Schnittstellen an.

Und ein generischer Webservice, der Screen Scraping anbietet, ist Yahoo Pipes. vorherige Stackoverflow-Frage dazu

Es ist nicht narrensicher, aber Sie können sich einen Parser wie z Schöne Suppe Es wird nicht auf magische Weise dieselben Informationen finden, wenn sich das Layout ändert, aber es ist viel einfacher als das Schreiben komplexer regulärer Ausdrücke. Beachten Sie, dass dies ein Python-Modul ist.

Benutzer-Avatar
Al.

Leider ist „Scraping“ die gebräuchlichste Lösung, wie Sie sagten, der Versuch, HTML von Websites zu analysieren. Sie könnten strukturelle Änderungen an der Seite erkennen und eine Warnung kennzeichnen, die Sie beheben müssen, damit eine Änderung an ihrem Ende nicht zu Datenverlust führt. Bis das semantische Web Wirklichkeit wird, ist dies so ziemlich die einzige Möglichkeit, einen großen Datensatz zu garantieren.

Alternativ können Sie sich an kleine Datensätze halten, die von APIs bereitgestellt werden. Yahoo arbeitet sehr hart daran, durchsuchbare Daten über APIs bereitzustellen (siehe YDN), ich denke, die Amazon-API öffnet viele Buchdaten usw.

Hoffe das hilft ein wenig!

BEARBEITEN: Und wenn Sie PHP verwenden, würde ich SimpleHTMLDOM empfehlen

Benutzer-Avatar
Nickf

Haben Sie sich mit der Verwendung einer HTML-Manipulationsbibliothek befasst? Ruby hat einige ziemlich nette. z.B hpricot

Mit einer guten Bibliothek können Sie die gewünschten Teile der Seite mit CSS-Selektoren oder xpath angeben. Diese wären viel robuster als die Verwendung von regulären Ausdrücken.

Beispiel aus dem hpricot-Wiki:

 doc = Hpricot(open("qwantz.html"))
 (doc/'div img[@src^="http://www.qwantz.com/comics/"]')
   #=> Elements[...]

Ich bin sicher, Sie könnten eine Bibliothek finden, die ähnliche Dinge in .NET oder Python usw. tut.

1131520cookie-check“Smarte” Art, Website-Daten zu analysieren und zu verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy