Frage

Ich muss eine Reihe von Webseiten analysieren, um Daten in eine Anwendung zu importieren.Jede Art von Webseite stellt dieselbe Art von Daten bereit.Das Problem besteht darin, dass der HTML-Code jeder Seite unterschiedlich ist und der Speicherort der Daten daher unterschiedlich ist.Ein weiteres Problem besteht darin, dass der HTML-Code schlecht formatiert ist, was die Verwendung eines XML-ähnlichen Parsers unmöglich macht.

Bisher ist die beste Strategie, die ich mir vorstellen kann, die Definition einer Vorlage für jede Art von Seite, wie zum Beispiel:

Vorlage A:

<html>
...
  <tr><td>Table column that is missing a td 
      <td> Another table column</td></tr>
  <tr><td>$data_item_1$</td>
...
</html>

Vorlage B:

<html>
...
  <ul><li>Yet another poorly formatted page <li>$data_item_1$</td></tr>
...
</html>

Auf diese Weise würde ich nur einen einzigen Parser für alle Seiten benötigen, der jede Seite mit ihrer Vorlage vergleicht und die abruft $data_item_1$, $data_item_2$, usw.Dennoch wird es eine Menge Arbeit sein.Können Sie sich eine einfachere Lösung vorstellen?Gibt es eine Bibliothek, die helfen kann?

Danke

War es hilfreich?

Lösung

Sie können die Seite Quelle durch ordentlich übergeben eine gültige Seite zu bekommen. Sie können ordentlich finden hier . Tidy hat Bindings für viele Programmiersprachen. Nachdem Sie dies getan haben, können Sie Ihre Lieblings-Parser / content Extraktionstechnik verwendet werden.

Andere Tipps

würde ich Html Agility Pack- empfehlen. Es hat die Fähigkeit, mit schlecht strukturiertem HTML zu arbeiten, während Ihnen Xml wie Auswahl XPath geben. Sie würden nach wie vor Artikel Vorlage müssen, oder wählen Sie verschiedene Selektionen und analysieren, aber es wird Sie über die schlechte Struktur Buckel.

Wie erwähnt Hier und zu anderen SO-Antworten zuvor, Wunderschöne Suppe kann seltsames HTML analysieren.

Beautiful Soup ist ein Python-HTML/XML-Parser, der für schnelle Projekte wie Screen-Scraping entwickelt wurde.Drei Funktionen machen es leistungsstark:

  1. Beautiful Soup verschluckt sich nicht, wenn Sie ihm ein schlechtes Markup geben.Es entsteht ein Analysebaum, der ungefähr so ​​viel Sinn ergibt wie Ihr Originaldokument.Dies reicht normalerweise aus, um die benötigten Daten zu sammeln und wegzulaufen.
  2. Beautiful Soup bietet ein paar einfache Methoden und pythonische Redewendungen zum Navigieren, Suchen und Ändern eines Analysebaums:ein Toolkit zum Zerlegen eines Dokuments und zum Extrahieren dessen, was Sie benötigen.Sie müssen nicht für jede Anwendung einen benutzerdefinierten Parser erstellen.
  3. Beautiful Soup konvertiert eingehende Dokumente automatisch in Unicode und ausgehende Dokumente in UTF-8.Sie müssen nicht über Kodierungen nachdenken, es sei denn, das Dokument gibt keine Kodierung an und Beautiful Soup kann eine solche nicht automatisch erkennen.Dann müssen Sie nur noch die ursprüngliche Kodierung angeben.

Beautiful Soup analysiert alles, was Sie ihm geben, und erledigt die Baumdurchquerung für Sie.Sie können sagen: „Alle Links finden“ oder „Alle Links der Klasse externalLink finden“, oder „Alle Links finden, deren URLs mit „foo.com“ übereinstimmen, oder „Die Tabellenüberschrift mit fettem Text suchen“ und dann „Geben Sie“ ein mir diesen Text.

Verwenden Sie HTML5-Parser wie html5lib .

Im Gegensatz zu HTML Tidy, dies wird Sie die Fehlerbehandlung sehr nahe, was Browser tun.

Es gibt ein paar C # spezifische Themen auf dieser, wie der Suche nach C # HTML-Parser .

Je nachdem, welche Daten Sie reguläre Ausdrücke extrahieren müssen könnte eine Option sein. Ich kenne eine Menge Leute bei dem Gedanken an mit regulären Ausdrücken auf strukturierte Daten Schauder wird aber die einfache Tatsache ist (wie Sie entdeckt haben), dass eine Menge von HTML ist nicht wirklich gut strukturiert und kann sehr schwer zu analysieren.

Ich hatte ein ähnliches Problem zu Ihnen, aber in meinem Fall wollte ich nur ein bestimmtes Stück von Daten von der Seite, die ohne Parsen das HTML so sehr schön ein RegEx gearbeitet zu identifizieren, war einfach.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top