Comment puis-je utiliser l'agilité HTML pour tout saisir entre et

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

Question

J'ai mal posé des questions sur le même projet la semaine dernière et je n'ai reçu aucune suggestion. Je vais essayer d'être plus clair. J'essaie de travailler avec les données du site Web www.gtin13.com . Par exemple, si vous entrez du beurre de cacahuète dans la recherche, j'essaie de saisir la description: ** Nabisco Nutter Butter Sandwich Cookies Beurre de cacahuètes au chocolat 4 Ct La * Taille : Taille: 12 oz Le GTIN: 0044000003562 * ean : ** 00- 44000-00356-2 upc: 044000003562 et upca: 04400000356. J'ai essayé d'utiliser nodeCollection avec SelectNodes ("<b>") et je reçois uniquement des erreurs. Est-il même possible d’utiliser l’agilité html pour récupérer les données entre <b> <br> également, puis pour analyser entre les / s? Avec mon manque d'expérience, je ne peux tout simplement pas progresser. Il ne semble pas que la page renvoyée ait ce que je considérerais comme de vrais nœuds. Si l'agilité html ne peut pas faire cela, quelqu'un peut-il suggérer une meilleure approche? Finalement, je voudrais envoyer chaque morceau de données à une table SQL. J'espère avoir présenté d'une manière plus logique.

La page renvoie les informations dans ce format source:

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

Réponse acceptée

Ce n'est pas si simple, car le document d'origine n'est pas très structuré (il ne s'agit pas d'une présentation hiérarchique, mais d'une présentation plate), mais voici comment vous pouvez extraire les principaux champs de texte avec le Pack d'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());
        }

Cela affichera:

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

NOTE: Ce n'est pas fini à 100%, car vous devrez analyser les variables size, ean et upc en utilisant une manipulation de chaîne standard (IndexOf, Substring, etc.) ou Regex, mais le côté html de la tâche est terminé.


Réponse populaire

En utilisant HTQL, la requête pour extraire la table entière de la page est:

<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 vous avez seulement besoin d’envoyer les résultats à une base de données SQL, je vous suggère d’utiliser le scraper Web IRobotSoft.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi