【问题标题】:Web scraper using HtmlAgilityPack使用 HtmlAgilityPack 的网络爬虫
【发布时间】:2013-12-10 22:05:50
【问题描述】:

我是 C# 的新手,所以这可能很明显如何让它工作或对我来说太复杂了,但我正在尝试使用 HtmlAgilityPack 设置和抓取网页。目前我的代码可以编译,但是当我编写字符串时,我只得到 1 个结果,而且它恰好是 ul 中 li 的最后一个结果。字符串拆分的原因是我最终可以将标题和描述字符串输出到 .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();


        }

    }
}

【问题讨论】:

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


    【解决方案1】:

    一个问题是您每次通过循环都会覆盖输出文件。你可能想要这样做:

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

    另外,您是否已单步执行此操作以查看您是否从您的SelectNode 电话中获得了多个HtmlNode

    最后,我看不出你在用titledescription 做什么。您是否打算将它们用于其他用途?

    【讨论】:

    • 那张打印效果很好,我是个傻瓜,一开始就把它放在错误的地方。现在所有城市都打印到文本文件。标题和描述的原因是让城市名称填充该字符串,然后让城市描述填充描述字符串,因此我可以设置一个 .csv 文件以稍后使用此数据。这就是对这些字符“-”、“”、“-”进行拆分的原因。想法是将这些数据设置为.csv格式,关键字是idea...谢谢您的回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多