Question

Je cherche à développer un grattoir Web en C # forme de fenêtre. Ce que je suis en train d'accomplir est la suivante:

  1. Obtenir l'URL de l'utilisateur.
  2. Chargez la page Web dans le contrôle interface utilisateur IE (navigateur embarqué) Winforms.
  3. Permet à l'utilisateur de sélectionner un texte (un seul tenant, de petite taille (ne dépassant pas 50 caractères)). à partir de la page Web chargée.
  4. Lorsque l'utilisateur souhaite conserver l'emplacement ( l'emplacement DOM HTML ), il doit être persisté dans la base de données, de sorte que l'utilisateur peut utiliser cet emplacement pour récupérer les données à cet endroit au cours de sa visites ultérieures.

On suppose que le site est un site chargé de pricelisting le taux indiqué ne cesse de changer, l'idée est de persister la hiérarchie des DOM afin que je puisse traverser la prochaine fois.

Je serais capable de le faire si tous les éléments HTML ont leurs attributs id. Dans le cas où l'ID est nul, je ne suis pas en mesure d'y arriver.

Quelqu'un pourrait-il suggérer une idée valable sur ce (un extrait de code strict minimum si possible).

Il serait utile, même si vous pouvez partager des ressources en ligne.

merci,

vijay

Était-ce utile?

La solution

Une approche consiste à construire une pile de balises / styles / id vers le bas à l'élément que vous souhaitez sélectionner.

De l'élément que vous voulez, traverse jusqu'à l'élément identifiant le plus proche. De cette façon, vous vous débarrasser de la plupart des l'en-tête en haut, etc. Ensuite, construire une séquence à rechercher.

Exemple:

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

Pour la exmaple vous stocker dans votre base de données une séquence de: [id = principal], div, durée, div, table ou peut-être div [class = pricearea], table .

Utilisation des styles / des classes peuvent également être utilisés pour créer votre chemin. Il est votre choix pour rechercher soit une balise, un attribut d'une balise ou une combinaison. Vous voulez aussi précis que possible avec le moins d'éléments possible pour le rendre robuste.

Si la mise en page change rarement, cela vous permettra de naviguer vers le même endroit à chaque fois.

Je voudrais aussi vous suggérons d'utiliser peut-être HTML Agility pack ou quelque chose de similaire pour l'analyse syntaxique DOM, comme la commande IE est lente.

screen scraping est amusant, mais il est difficile de l'obtenir 100% pour toutes les pages. Bonne chance!

Autres conseils

Après un peu de googler, j'ai rencontré une solution assez simple. Ci-dessous joint est l'extrait de l'échantillon.

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
        }

J'ai utilisé un Navigateur Web intégré dans une applications Winforms, qui charge le DOM HTML de la page Web actuelle.

IHTMLElement exemple expose une propriété nommée 'SourceIndex' qui attribue un identifiant unique à chacun des éléments HTML.

On peut stocker ce SourceIndex à la DB et la requête du contenu à cet endroit. en utilisant le code suivant.

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
            }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top