¿Cómo puedo usar la agilidad html para agarrar todo entre y

c# html-agility-pack html-parsing screen-scraping

Pregunta

La semana pasada pregunté mal por este mismo proyecto y no recibí ninguna sugerencia. Intentaré ser más claro. Estoy tratando de trabajar con datos del sitio web www.gtin13.com . Por ejemplo, si ingresa mantequilla de maní en la búsqueda, intento capturar la descripción: ** Nabisco Nutter Butter Sandwich Cookies Chocolate Peanut Butter 4 Ct El * Tamaño : Tamaño: 12 oz El GTIN: 0044000003562 * ean : ** 00- 44000-00356-2 upc: 044000003562 y upca: 04400000356. He intentado usar nodeCollection con SelectNodes ("<b>") y todo lo que recibo son errores. ¿Es incluso posible usar la agilidad html para agarrar los datos entre <b> <br> y luego analizar entre / s? Con mi falta de experiencia no puedo hacer ningún progreso en esto. No parece que la página devuelta tenga lo que consideraría nodos verdaderos. Si la agilidad de html no puede hacer esto, ¿alguien puede sugerir un mejor enfoque? Finalmente, me gustaría enviar cada parte de los datos a una tabla de SQL. Espero haberlo presentado de una manera que tenga mejor sentido.

La página devuelve la información en este formato fuente:

<b><a href="/product/nabisco+nutter+butter+sandwich+cookies+chocolate+peanut+butter+4+ct/">Nabisco Nutter Butter Sandwich Cookies Chocolate Peanut Butter 4 Ct</a></b><br />

Size: 12 oz<br />

GTIN/EAN-13: 0044000003562 / 00-44000-00356-2<br />

UPC-A: 044000003562 / 04400000356<br />



Tags:

<a href="/tag/chocolate/">Chocolate</a>, 

<a href="/tag/cookies/">Cookies</a>, 
 ..<br />

<br >

Respuesta aceptada

No es tan fácil porque el documento original es bastante desestructurado (no utiliza un diseño jerárquico, sino uno plano), pero aquí es cómo puede extraer los campos de texto principales con el paquete de agilidad Html:

        HtmlDocument doc = new HtmlDocument();
        doc.Load("yourDoc.Htm");

        // Get A nodes that have an HREF attribute
        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//b/a[@href]"))
        {
            // This will contain anchor's displayed text
            string title = node.InnerText;
            Console.WriteLine("title=" + title);

            // Get the 1st BR, and then it's next sibling of TEXT type.
            HtmlNode sizeNode = node.SelectSingleNode("../following-sibling::br[1]/following-sibling::text()");
            Console.WriteLine(" size=" + sizeNode.InnerText.Trim());

            // Get the 3nd BR, and then it's next sibling of TEXT type.
            HtmlNode eanNode = node.SelectSingleNode("../following-sibling::br[2]/following-sibling::text()");
            Console.WriteLine(" ean=" + eanNode.InnerText.Trim());

            // Get the 3rd BR, and then it's next sibling of TEXT type.
            HtmlNode upcNode = node.SelectSingleNode("../following-sibling::br[3]/following-sibling::text()");
            Console.WriteLine(" upc=" + upcNode.InnerText.Trim());
        }

Esto mostrará:

title=Peanut Delight Peanut Butter & Grape Jelly
 size=Size: 18 oz
 ean=GTIN/EAN-13: 0041498143909 / 00-41498-14390-9
 upc=UPC-A: 041498143909 / 04149814390
title=Nabisco Nutter Butter Sandwich Cookie Bites Peanut Butter
 size=Size: 10 oz
 ean=GTIN/EAN-13: 0044000046118 / 00-44000-04611-8
 upc=UPC-A: 044000046118 / 04400004611
title=Nabisco Nutter Butter Sandwich Cookies Chocolate Peanut Butter 4 Ct
 size=Size: 12 oz
 ean=GTIN/EAN-13: 0044000003562 / 00-44000-00356-2
 upc=UPC-A: 044000003562 / 04400000356

etc ...

NOTA: no está terminado al 100%, ya que tendrá que analizar el tamaño, la variable ean y upc utilizando la manipulación de cadenas estándar (IndexOf, Substring, etc.) o Regex, pero el lado de HTML está hecho.


Respuesta popular

Usando HTQL, la consulta para extraer toda la tabla de la página es:

<div (CLASS='BGC')>1.<div (CLASS='CON')>1.<div (CLASS='SC')>1.<div (ID='post-20')>1.<div (CLASS='PostContent')>1.<b sep>2-0 {
  title=<a>1:tx; 
  size=/'Size:'~'<br />'/;
  gtin=/'GTIN/EAN-13:'~'<br />'/;
  upc=/'UPC-A:'~'<br />'/;
  tags=/'Tags:'~'<br />'/;
}

Si solo necesita enviar los resultados a la base de datos SQL, le sugiero que utilice el raspador web IRobotSoft.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué