Ich beantwortete einige Quizfragen für ein Interview und die Frage war, wie würde ich Screen Scraping machen. Das heißt, den Inhalt einer Webseite auswählen, vorausgesetzt, Sie haben keine besser strukturierte Möglichkeit, die Informationen direkt abzufragen (z. B. einen Webdienst).Screen Scraping: Reguläre Ausdrücke oder XQuery-Ausdrücke?
Meine Lösung war eine XQuery Ausdruck verwenden. Der Ausdruck war ziemlich lang, weil der Inhalt, den ich brauchte, ziemlich tief in der HTML-Hierarchie war. Ich musste einen fairen Weg durch die Vorfahren suchen, bevor ich ein Element mit einem id
Attribut fand. Zum Beispiel sieht wie folgt aus einer Amazon.com-Seite für Produkt-Maß Schaben:
//a[@id="productDetails"]
/following-sibling::table
//h2[contains(child::text(), "Product Details")]
/following-sibling::div
//li
/b[contains(child::text(), "Product Dimensions:")]
/following-sibling::text()
, dass ein ziemlich bösen Ausdruck ist, aber das ist, warum Amazon einen API Web-Service zur Verfügung stellt. Wie auch immer, es ist nur ein Beispiel. Die Frage ging nicht um Amazon, es geht um Screen Scraping.
Der Interviewer mochte meine Lösung nicht. Er hielt es für fragil, da eine Änderung des Seitendesigns von Amazon das Umschreiben des XQuery-Ausdrucks erfordern würde. Das Debuggen eines XQuery-Ausdrucks, der nichts auf der Seite entspricht, auf die er angewendet wird, ist schwierig.
Ich war nicht mit seinen Aussagen nicht einverstanden, aber ich dachte nicht, seine Lösung war eine Verbesserung: er dachte, es ist besser, einen regulären Ausdruck zu verwenden, und nach Inhalt und Markup in der Nähe des Versandgewichtes zu suchen. Zum Beispiel, mit Perl:
Mein Gegenargument war, dass dies auch anfällig für Amazon ihren HTML-Code ändern. Sie könnten HTML-Tags in Großbuchstaben buchstabieren (<LI>
) oder CSS-Attribute hinzufügen oder <b>
zu <span>
ändern oder die Bezeichnung "Product Dimensions:" zu "Dimensions:" oder viele andere Arten von Änderungen ändern. Mein Punkt war, dass reguläre Ausdrücke die Schwächen, die er in meiner XQuery-Lösung hervorrief, nicht lösen.
Darüber hinaus können reguläre Ausdrücke jedoch falsch positive Ergebnisse finden, sofern Sie dem Ausdruck nicht genügend Kontext hinzufügen. Es kann auch unbeabsichtigt Inhalt zuordnen, der zufällig in einem Kommentar oder einer Attributzeichenfolge oder einem CDATA-Abschnitt enthalten ist.
Meine Frage ist, welche Technologie verwenden Sie Bildschirm scraping? Warum haben Sie diese Lösung gewählt? Gibt es einen zwingenden Grund, einen zu verwenden? Oder nie den anderen benutzen? Gibt es neben den oben gezeigten eine dritte?
PS: Nehmen wir als Argument an, dass es keine Web-Service-API oder einen direkteren Weg gibt, den gewünschten Inhalt zu erhalten.
Dies ist der Hauptgrund für die Vermeidung von XML-basierten Web Scraping. Kein XML-Prozessor ist so fehlerverzeihend wie ein Browser. Die Seite muss nur eine wohlgeformte Regel brechen, um XQuery vollständig unbrauchbar zu machen. – harpo