2011-01-03 13 views
12

Se me ha asignado la tarea de rozar la pantalla de una de nuestras aplicaciones web heredadas para extraer ciertos datos del código. Los datos están formateados y "debería" mostrarse exactamente igual cada vez. Simplemente no estoy seguro de cómo hacerlo. Es un archivo html completo con navegaciones de encabezado y pie de página, pero en el medio de todo esto están los datos que necesito.Screen Scraping HTML with C#

necesito para extraer el valor Nombre de la empresa, nombre de contacto, teléfono, dirección de correo electrónico, etc.

Aquí hay un ejemplo de lo que el código es el siguiente:

...html above here 

<br /><br /> 
<table cellpadding="0" cellspacing="12" border="0"> 
    <tr> 
     <td valign="top" align="center"> 
      <!-- Company Info --> 

      <table cellpadding="0" cellspacing="0" border="0"> 
       <tr> 
        <td class="black"> 
         <table cellspacing="1" cellpadding="0" border="0" width="370"> 
          <tr> 
           <th>ABC INDUSTRIES</th> 
          </tr> 
          <tr> 
           <td class="search"> 

            <table cellpadding="5" cellspacing="0" border="0" width="100%"> 
             <tr> 
              <td> 
               <table cellpadding="1" cellspacing="0" border="0" width="100%"> 
                <tr> 
                 <td align="center" colspan="2"><hr></td> 
                </tr> 
                <tr> 
                 <td align="right" nowrap><b><font color="FF0000">Contact Person&nbsp;<img src="/images/icon_contact.gif" align="absmiddle">&nbsp;:</font></b></td> 
                 <td align="left" width="100%">&nbsp;Joe Smith</td> 
                </tr> 
                <tr> 
                 <td align="right" nowrap><b><font color="FF0000">Phone Number&nbsp;<img src="/images/icon_phone.gif" align="absmiddle">&nbsp;:</font></b></td> 
                 <td align="left" width="100%">&nbsp;555-555-5555</td> 
                </tr> 
                <tr> 
                 <td align="right" nowrap><b><font color="FF0000">E-mail Address&nbsp;<img src="/images/icon_email.gif" align="absmiddle">&nbsp;:</font></b></td> 
                 <td align="left" width="100%">&nbsp;<a HREF="mailto:[email protected]">[email protected]</a></td> 
                </tr> 
                more... 

Hay más código en la pantalla en una estructura de tabla diferente que también necesito extraer.

+0

Si el HTML está bien formateado en XML, debería ser muy fácil colocar el texto en un documento XML y obtener las piezas que necesita con XPath o XSL. – Juliet

Respuesta

23

¿Está buscando sugerencias sobre cómo lograr esto? El HTML Agility Pack probablemente sea su mejor apuesta para el análisis DOM en general. Puede haber un poco de retoques y prueba y error para mantener el arañazo de la pantalla (generalmente existe para ese tipo de cosas), pero esa biblioteca es bastante buena para analizar HTML.

Técnicamente, cualquier análisis XML (incluso LINQ nativo de XML) debe hacer el truco, pero los sitios web tienen la mala costumbre de no estar bien formado para que pueda funcionar en pequeños dolores de cabeza aquí y allá.

+2

A +1 en HTML Agility Pack. Perdí una docena de horas tratando de usar clases xml en .Net para analizar html mal formado (es decir, la mayoría de los html en el mundo real) antes de probar el paquete de agilidad HTML. Obtuve los resultados que necesitaba en una décima parte del tiempo. Ojalá hubiera sabido sobre HTML Agility desde el principio. –

-1

Si usted tiene el HTML almacenado en una cadena siempre se puede utilizar expresiones regulares con grupos de captura para analizar la información que necesita.

+1

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+1

Gracias por eso, me aseguraré de nunca volver a recomendar eso jajaja –

1

En proyectos recientes, utilicé con éxito el WebRequest y se clasificó relacionado para descargar el HTML de una URL y luego el analizador SgmlReader para acceder realmente al contenido estructurado.

1

Si los comentarios de la página y el código de disposición de la tabla son los mismos cuando sea necesario, insertaba la página en una cadena y utilizaba una serie de funciones .IndexOf y .Substring para analizar los datos. Use la función IndexOf para encontrar los índices inicial y final de cada campo. Utilice estos índices de campo en la función Subcadena para captar los datos.

No es bonito pero hace el trabajo bien.