Domanda

Sto cercando di sviluppare un raschietto Web in C # forme delle finestre. Quello che sto cercando di realizzare è la seguente:

  1. Ottenere l'URL da parte dell'utente.
  2. Caricare la pagina Web nel controllo IE interfaccia utente (browser incorporato) in WinForms.
  3. consentire all'utente di selezionare un testo (contigui, piccola (non superiore a 50 caratteri)). dalla pagina web caricata.
  4. Quando l'utente desidera a persistere la posizione ( la posizione HTML DOM ) deve essere persistito nel DB, in modo che l'utente può utilizzare tale posizione per recuperare i dati in quella posizione durante il suo visite successive.

Si supponga che il sito web caricata è un sito pricelisting e la tariffa indicata continua a cambiare, l'idea è di persistere la gerarchia DOM in modo che possa attraversare la prossima volta.

Vorrei essere in grado di farlo se tutti gli elementi HTML avevano i loro attributi id. Nel caso in cui l'id è nullo, io non sono in grado di raggiungere questo obiettivo.

Qualcuno potrebbe suggerire un'idea valida su questo (un nudo minimo frammento di codice, se possibile).?

Sarebbe utile, anche se è possibile condividere alcune risorse online.

grazie,

Vijay

È stato utile?

Soluzione

Un approccio è quello di costruire una pila di tag / stili / id verso il basso per l'elemento che si desidera selezionare.

Dal elemento che si desidera, traversare fino all'elemento id più vicino. In questo modo si sbarazzarsi della maggior parte dei top intestazione ecc Poi costruire una sequenza di cercare.

Esempio:

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

Per l'exmaple si memorizzare nel vostro db una sequenza di: [id = principale], div, arco, div, tabella o forse div [class = pricearea], tabella .

Uso degli stili / classi potrebbero anche essere utilizzati per creare il vostro percorso. A voi la scelta di cercare un tag, un attributo di un tag o una combinazione. Si vuole che il più precisi possibile con il minor numero possibile di elementi per rendere più robusta.

Se il layout cambia raramente, questo ti consentirebbe di navigare nella stessa posizione ogni volta.

Vorrei anche suggerire che si forse utilizzare HTML Agility pacchetto o qualcosa di simile per il parsing DOM, come il controllo IE è lento.

screen scraping è divertente, ma è difficile ottenere il 100% per tutte le pagine. Buona fortuna!

Altri suggerimenti

Dopo un po 'di googling, ho incontrato una soluzione abbastanza semplice. Qui di seguito allegato è il frammento di esempio.

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
        }

Ho usato un Browser Web incorporato in un applicazioni WinForms, che carica il DOM HTML della pagina Web corrente.

IHTMLElement esempio espone una proprietà denominata 'sourceIndex' che assegna un ID univoco a ciascuno degli elementi HTML.

Si può memorizzare questa sourceIndex al DB e Query per il contenuto in quella posizione. utilizzando il seguente codice.

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
            }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top