Racleur Web utilisant HtmlAgilityPack

.net c# html-agility-pack visual-studio-2012 web-scraping

Question

Je suis nouveau en C #, il est donc très évident de savoir comment le mettre en oeuvre ou le rendre trop complexe pour moi, mais je tente de configurer et de gratter une page Web à l'aide de HtmlAgilityPack. Actuellement, mon code est compilé, mais lorsque j'écris la chaîne, je n'ai qu'un résultat et il se trouve que ce dernier est le dernier résultat de la chaîne li in the ul. La raison de cette division est que je peux éventuellement sortir le titre et les chaînes de description dans un fichier .csv pour une utilisation ultérieure. Je ne suis pas sûr de savoir quoi faire ensuite, donc pourquoi je demande de l’aide / compréhension / idées / pensées / suggestions qui peuvent être offertes. Je vous remercie!

    private void button1_Click(object sender, EventArgs e)
    {
        List<string> cities = new List<string>();
        //var xpath = "//h2[span/@id='Cities']";
        var xpath = "//h2[span/@id='Cities']" + "/following-sibling::ul[1]" + "/li";

        WebClient web = new WebClient();
        String html = web.DownloadString("http://wikitravel.org/en/Vietnam");

        hap.HtmlDocument doc = new hap.HtmlDocument();
        doc.LoadHtml(html);


        foreach (hap.HtmlNode node in doc.DocumentNode.SelectNodes(xpath)) 
        {
            string all = node.InnerText;

            //splits text between '—', '-' or ' ' into 2 parts
            string[] split = all.Split(new char[] { '—', ' ', '-' }, StringSplitOptions.None);

            string title;
            string description;

            int nodeCount;
            nodeCount = node.ChildNodes.Count;

            if (nodeCount == 2)
            {
                title = node.ChildNodes[0].InnerText;
                description = node.ChildNodes[1].InnerText;
            }
            else if (nodeCount == 4)
            {
                title = node.ChildNodes[0].InnerText;
                description = node.ChildNodes[1].InnerText + node.ChildNodes[2].InnerText;
            }
            else
            {
                title = "Error";
                description = "The node cound was not 2 or 3.  Check the div section.";
            }

            System.IO.StreamWriter write = new System.IO.StreamWriter(@"C:\Users\cbrannin\Desktop\textTest\testText.txt");
            write.WriteLine(all);

            write.Close();


        }

    }
}

Réponse acceptée

Un problème est que vous écrasez le fichier de sortie à chaque fois dans la boucle. Vous voulez probablement faire ceci:

using (StreamWriter write = new StreamWriter(@"filename"))
{
    foreach (hap.HtmlNode node in doc.DocumentNode.SelectNodes(xpath))
    {
        // do your thing
        write.WriteLine(all);
    }
}

En outre, avez-vous HtmlNode une seule HtmlNode pour voir si vous obtenez plus d'un HtmlNode partir de votre appel SelectNode ?

Enfin, je ne vois pas où vous faites quoi que ce soit avec le title ou la description . Aviez-vous l'intention de les utiliser pour autre chose?




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