Pregunta

Estoy buscando para desarrollar un rascador Web en formas de ventana # C. Lo que estoy tratando de lograr es la siguiente:

  1. Obtenga la dirección del usuario.
  2. Carga la página Web en el control de IE interfaz de usuario (navegador integrado) en WinForms.
  3. Permite al usuario seleccionar un texto (contiguo, pequeño (no superior a 50 caracteres)). desde la página web cargado.
  4. Cuando el usuario desea que persista la ubicación ( la ubicación HTML DOM ) tiene que ser mantenido en la base de datos, de modo que el usuario puede utilizar esa ubicación para recuperar los datos en esa ubicación durante su las subsiguientes visitas.

Supongamos que el sitio web es un sitio cargado pricelisting, el tipo indicado mantiene en cambio, la idea es que persista la jerarquía DOM para que pueda atravesar la próxima vez.

Yo sería capaz de hacer esto si todos los elementos HTML tenían sus atributos id. En el caso de que el id es nula, no soy capaz de lograr esto.

Podría alguien sugerir una idea válida en este (un fragmento de código desnudo mínimo si es posible).?

Sería útil, incluso si usted puede compartir algunos recursos en línea.

Gracias,

Vijay

¿Fue útil?

Solución

Un enfoque consiste en construir una pila de etiquetas / estilos / Identificación hasta el elemento que desea seleccionar.

Desde el elemento que desee, hasta atravesar el elemento de identificación más cercano. De esta manera se va a deshacerse de la mayor parte de la parte superior de cabecera etc A continuación, construir una secuencia para tener en cuenta.

Ejemplo:

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

Para el exmaple se almacenaría en su base de datos una secuencia de: [id = main], div, palmo, div, tabla o tal vez div [class = pricearea], la tabla .

Utilización de estilos / clases podría también ser utilizado para crear su camino. Es su elección, ya sea para buscar una etiqueta, un atributo de una etiqueta o una combinación. ¿Quieres que lo más preciso posible con el menor número posible de elementos para que sea robusto.

Si el diseño rara vez cambia, esto permitirá navegar en la misma ubicación cada vez.

También sugeriría que quizás utiliza HTML agilidad Paquete o algo similar para el análisis DOM, como el control IE es lento.

captura de imágenes es divertido, pero es difícil conseguir que el 100% para todas las páginas. Buena suerte!

Otros consejos

Después de un poco de google, me encontré con una solución bastante simple. A continuación se adjunta el fragmento de la muestra.

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
        }

he usado un Embedded Web Browser en unas aplicaciones Winforms, que carga el código HTML DOM de la página web actual.

La IHTMLElement ejemplo expone una propiedad denominada 'sourceIndex' que asigna un identificador único a cada uno de los elementos HTML.

Uno puede almacenar esta sourceIndex a la base de datos y consulta para el contenido en ese lugar. usando el siguiente código.

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
            }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top