2011-03-16 14 views
5

He leído que HTMLAgility 1.4 es una gran solución para el raspado de una página web. Siendo un programador nuevo, espero poder obtener algo de información sobre este proyecto. Lo estoy haciendo como un formulario de solicitud C#. La página con la que estoy trabajando es bastante sencilla. La información que necesito está atrapada entre solo 2 etiquetas y . Mi objetivo es extraer los datos de Número de pieza, Manu-Número, Descripción, Manu-País, Última modificación, Última modificación Fuera de la página y enviar los datos a una tabla sql. Un giro es que también hay una pequeña foto de PNG que también debe ser tomada desde el código de SSR = "/ código de pieza/númeroRaspar una página web con C# y HTMLAgility

No tengo ningún código completado que funcione. Pensé que este código me diría si yo estoy dirigiendo en la dirección correcta. Incluso entrar en la depuración no puedo ver que se hace algo. Podría alguien posiblemente me punto en la dirección correcta en esto. Cuanto más detallada sea la mejor, ya que es evidente que tengo mucho que Gracias a aprender que realmente lo apreciaría

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using HtmlAgilityPack; 
using System.Xml; 

namespace Stats 
{ 
    class PartParser 
    { 
     static void Main(string[] args) 
     { 
      HtmlDocument doc = new HtmlDocument(); 
      doc.LoadHtml("http://localhost");//my understanding this reads the entire page in? 
      var tables = doc.DocumentNode.SelectNodes("//table");// I assume that this sets up the search for words containing table 

     } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       Console.WriteLine(ex.StackTrace); 
       Console.ReadKey();  
      } 
     } 
    } 
} 

El código web es:..

<!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> 
<title>Part Number Database: Item Record</title> 
<table class="data"> 
<tr><td>Part-Num</td><td width="50"></td><td><img src="/partcode/number/072140" alt="072140"/></td></tr> 
<tr><td>Manu-Number</td><td width="50"></td><td><img src="/partcode/manu/00721408" alt="00721408" /></td></tr>  
<tr><td>Description</td><td></td><td>Widget 3.5</td></tr> 
<tr><td>Manu-Country</td><td></td><td>United States</td></tr>  
<tr><td>Last Modified</td><td></td><td>26 Jan 2009, 8:08 PM</td></tr>  
<tr><td>Last Modified By</td><td></td><td>Manu</td></tr> 
</table> 
<p> 
</body> 
</html> 
+0

Consulte mi respuesta si desea un código que funcione utilizando el código HTML que ha proporcionado. –

Respuesta

5

Control hacia fuera este artículo sobre 4GuysFromRolla

http://www.4guysfromrolla.com/articles/011211-1.aspx

Este es el artículo he utilizado como punto de partida con HTML agilidad paquete y ha funcionado muy bien. Estoy seguro de que obtendrá toda la información que necesita de este artículo para realizar las tareas que está tratando de completar.

5

La parte inicial está apagado:

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml("http://localhost"); 

LoadHtml(html) cargas de una cadena HTML en el documento, creo que quiere algo como esto en su lugar:

HtmlWeb htmlWeb = new HtmlWeb(); 
HtmlDocument doc = htmlWeb.Load("http://stackoverflow.com"); 
4

Un código de trabajo, de acuerdo con el código HTML fuente que proporcionaste Se puede factorizar, y no estoy comprobando nulos los valores (en rows, cells, y cada valor dentro de la case). Si usted tiene la página en 127.0.0.1, que va a funcionar. Justo en la pasta dentro del método de una Aplicación de consola Main y tratar de entenderlo.

HtmlDocument doc = new HtmlWeb().Load("http://127.0.0.1");  

var rows = doc.DocumentNode.SelectNodes("//table[@class='data']/tr"); 
foreach (var row in rows) 
{ 
    var cells = row.SelectNodes("./td"); 
    string title = cells[0].InnerText; 
    var valueRow = cells[2]; 
    switch (title) 
    { 
     case "Part-Num": 
      string partNum = valueRow.SelectSingleNode("./img[@alt]").Attributes["alt"].Value; 
      Console.WriteLine("Part-Num:\t" + partNum); 
      break; 
     case "Manu-Number": 
      string manuNumber = valueRow.SelectSingleNode("./img[@alt]").Attributes["alt"].Value; 
      Console.WriteLine("Manu-Num:\t" + manuNumber); 
      break; 
     case "Description": 
      string description = valueRow.InnerText; 
      Console.WriteLine("Description:\t" + description); 
      break; 
     case "Manu-Country": 
      string manuCountry = valueRow.InnerText; 
      Console.WriteLine("Manu-Country:\t" + manuCountry); 
      break; 
     case "Last Modified": 
      string lastModified = valueRow.InnerText; 
      Console.WriteLine("Last Modified:\t" + lastModified); 
      break; 
     case "Last Modified By": 
      string lastModifiedBy = valueRow.InnerText; 
      Console.WriteLine("Last Modified By:\t" + lastModifiedBy); 
      break; 
    } 
} 
+0

gracias por este ejemplo, me ha enseñado un poco más sobre el uso de la agilidad html. Si está interesado en un desafío, tengo otra página en la que estoy trabajando para obtener datos que no tienen un diseño típico. Me encantaría ver cómo manejarías la situación. – JRB

+2

@JRB Bueno, sugiero que probarlo por ti mismo primero, y si usted tiene problemas para hacer que funcione, que lo ponga como una pregunta y lo que ha intentado hacer, y vamos a tratar de ayudarle. –

Cuestiones relacionadas