Come posso usare l&#39;agilità html per afferrare tutto tra <b>e <br></b>

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

Domanda

Ho chiesto male su questo stesso progetto la scorsa settimana e non ho ricevuto alcun suggerimento. Cercherò di essere più chiaro. Sto cercando di lavorare con i dati del sito www.gtin13.com . Per esempio, se si inserisce il burro di arachidi nella ricerca, sto cercando di afferrare la descrizione: ** Nabisco Nutter Butter Sandwich Cookies Chocolate Peanut Butter 4 Ct L'* Formato: Formato: 12 oz Il GTIN: 0.044.000,003562 millions * EAN: ** 00- 44000-00356-2 upc: 044000003562 e upca: 04400000356. Ho provato a utilizzare nodeCollection con SelectNodes ("<b>") e tutti gli errori sono. È persino possibile utilizzare l'agilità HTML per acquisire i dati tra <b> <br> e quindi analizzare tra / s? Con la mia mancanza di esperienza, non riesco a fare progressi. Non sembra che la pagina restituita abbia ciò che considererei i veri nodi. Se l'agilità html non può farlo, qualcuno può suggerire un approccio migliore? Alla fine vorrei inviare ogni pezzo di dati a una tabella sql. Spero di averlo presentato in un modo che abbia più senso.

La pagina restituisce le informazioni in questo formato sorgente:

<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 >

Risposta accettata

Non è così facile perché il documento originale è abbastanza non strutturato (non si utilizza un layout gerarchico, ma uno piatto), ma ecco come è possibile estrarre i campi di testo principali con il pacchetto agilità 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());
        }

Questo mostrerà:

        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());
        }

eccetera...

NOTA: Non è finito al 100%, poiché dovrai analizzare le variabili size, ean e upc usando la manipolazione standard delle stringhe (IndexOf, Substring, ecc ...) o Regex, ma il lato Html delle cose è fatto.


Risposta popolare

Utilizzando HTQL, la query per estrarre l'intera tabella dalla pagina è:

<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 />'/;
}

Se hai solo bisogno di inviare i risultati al database sql, allora ti suggerisco di usare IRobotSoft Web Scraper.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché