Frage

Ich suche einen Web Scraper in C # Fensterformen zu entwickeln. Was ich versuche zu erreichen ist wie folgt:

  1. Sie die URL von dem Benutzer.
  2. Laden Sie die Webseite im IE UI-Steuerung (eingebetteten Browser) in WinForms.
  3. erlauben es dem Benutzer, einen Text zu wählen (angrenzenden, kleinen (nicht mehr als 50 Zeichen)). von der geladenen Webseite.
  4. Wenn der Benutzer den Speicherort (, um den HTML-DOM Standort ) in die DB beibehalten werden muss bestehen bleiben, so dass der Benutzer diese Position verwenden, um die Daten in dieser Position zu holen während seines zukünftige Besuche.

Nehmen wir an, die geladene Webseite ist ein pricelisting Website und der angegebene Preis hält auf zu ändern, ist die Idee, die DOM-Hierarchie bestehen bleiben, so dass ich es beim nächsten Mal durchqueren kann.

würde ich in der Lage sein, dies zu tun, wenn alle HTML-Elemente ihre id Attribute haben. In dem Fall, dass die ID null ist, ich bin das nicht in der Lage zu erreichen.

Könnte jemand vorschlagen, eine gültige Idee dazu (ein Minimum Code-Schnipsel wenn möglich).

Es wäre hilfreich, auch wenn Sie einige Online-Ressourcen gemeinsam nutzen können.

Danke,

vijay

War es hilfreich?

Lösung

Ein Ansatz ist es, einen Stapel von Tags / styles / id nach unten auf das Element zu bauen, die Sie auswählen möchten.

Aus dem Element, das Sie wollen, fahren an die nächste ID-Element nach oben. Auf diese Weise werden Sie von den meisten der Top-Header loszuwerden etc. Dann für eine Sequenz zu sehen bauen.

Beispiel:

<html>
  <body>
    <!-- lots of html -->
    <div id="main">
       <div>
          <span>
             <div class="pricearea">
                <table> <!-- with price data -->

Für die exmaple würden Sie in Ihrem db speichern eine Folge von: [id = main], div, spanne, div, Tabelle oder vielleicht div [class = pricearea], Tabelle .

Stile / Klassen können auch Ihren Weg erstellen verwendet werden. Sie haben die Wahl entweder für einen Tag, ein Attribut eines Tags oder einer Kombination zu suchen. Sie wollen es so genau wie möglich mit so wenig Elementen wie möglich es robuster zu machen.

Wenn das Layout selten ändert, würde dies können Sie an der gleichen Stelle jedes Mal navigieren.

Ich würde auch vorschlagen, dass Sie vielleicht HTML Agility-Pack verwenden oder etwas ähnliches für das DOM-Parsing, wie die IE Kontrolle ist langsam.

Screen Scraping ist Spaß, aber es ist schwierig, es zu 100% für alle Seiten zu bekommen. Viel Glück!

Andere Tipps

Nach einem bisschen googeln, stieß ich auf eine recht einfache Lösung. Unterhalb der Probe Schnipsel befestigt ist.

if (webBrowser.Document != null)
        {
            IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument;// loads the HTML DOM
            IHTMLSelectionObject selection = HtmlDoc.selection;// Fetches the currently selected HTML Element.
            IHTMLTxtRange range = (IHTMLTxtRange)selection.createRange();
            IHTMLElement parentElement = range.parentElement();// Identifies the parent element
            targetSourceIndex = parentElement.sourceIndex;               
            //dataLocation = range.parentElement().id;                
            MessageBox.Show(range.text);//range.parentElement().sourceIndex
        }

Ich habe einen Embedded Web Browser in einer WinForms-Anwendungen, die Lasten des HTML DOM der aktuellen Webseite.

Die IHTMLElement Beispiel stellt eine Eigenschaft mit dem Namen 'Sourceindex', die zu jedem der HTML-Elemente eine eindeutige ID zuweist.

Man kann speichert diesen Sourceindex an die DB und Abfrage für den Inhalt an dieser Stelle. mit dem folgenden Code.

if (webBrowser.Document != null)
            {
                IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument;
                IHTMLElement targetElement = null;
                foreach (IHTMLElement domElement in HtmlDoc.all)
                {
                    if (domElement.sourceIndex == int.Parse(node.InnerText))// fetching the persisted data from the XML file.
                    {
                        targetElement = domElement;
                        break;
                    }
                }

                MessageBox.Show(targetElement.innerText); //range.parentElement().sourceIndex
            }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top