Веб-скребок с использованием HtmlAgilityPack

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

Вопрос

Я новичок в C #, поэтому это может быть очень очевидно, как заставить это работать или слишком сложно для меня, но я пытаюсь настроить и очистить веб-страницу с помощью HtmlAgilityPack. В настоящее время мой код компилируется, но когда я пишу строку, я получаю только 1 результат, и это последний результат из li в ul. Причина разделения строк заключается в том, что я могу в конечном итоге вывести строки заголовка и описания в .csv для дальнейшего использования. Я просто не уверен, что делать дальше, поэтому я прошу любую помощь / понимание / идеи / мысли / предложения, которые могут быть предложены. Спасибо!

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


        }

    }
}

Принятый ответ

Одна из проблем заключается в том, что вы каждый раз переписываете выходной файл через цикл. Вы, вероятно, захотите сделать это:

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

Кроме того, у вас есть HtmlNode это, чтобы узнать, получаете ли вы более одного HtmlNode из своего вызова SelectNode ?

Наконец, я не вижу, где вы делаете что-либо с title или description . Вы планировали использовать их для чего-то еще?



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow