Web Scraper mit HtmlAgilityPack

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

Frage

Ich bin neu in C #, also könnte das sehr offensichtlich sein, wie ich das zur Arbeit bringen kann oder viel zu komplex für mich, aber ich versuche eine Webseite mit dem HtmlAgilityPack einzurichten und zu scrappen. Momentan kompiliert sich mein Code, aber wenn ich die Zeichenfolge schreibe, bekomme ich nur 1 Ergebnis und es ist zufällig das letzte Ergebnis von der Li in der ul. Der Grund für die String-Aufteilung ist, dass ich die Titel- und Beschreibungsstrings zur weiteren Verwendung in eine .csv ausgeben kann. Ich bin mir nur unsicher, was ich als nächstes tun soll, weshalb ich um Hilfe / Verständnis / Ideen / Gedanken / Vorschläge, die angeboten werden können, bitte. Vielen Dank!

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


        }

    }
}

Akzeptierte Antwort

Ein Problem besteht darin, dass Sie die Ausgabedatei jedes Mal durch die Schleife überschreiben. Sie möchten das wahrscheinlich tun:

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

Haben Sie das auch einzeln gemacht, um zu sehen, ob Sie mehr als einen HtmlNode von Ihrem SelectNode Aufruf erhalten?

Schließlich sehe ich nicht, wo du etwas mit dem title oder der description machst. Wolltest du diese für etwas anderes verwenden?



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum