【问题标题】:Html Agility Pack Empty Values out of TablesHtml Agility Pack 表中的空值
【发布时间】:2014-09-02 22:26:57
【问题描述】:

我正在尝试学习一些基本的抓取,并且感谢这个网站,我已经能够学习很多新东西,但现在我遇到了这个问题......这是我正在使用的代码:

var web = new HtmlWeb();
var doc = web.Load("url");
var nodes = doc.DocumentNode.SelectNodes("//*[@id='hotellist_inner']/div");
StreamWriter output = new StreamWriter("out.txt");

if (nodes != null)
{
    foreach (HtmlNode item in nodes)
    {
        if (item != null && item.Attributes["data-recommended"] != null)
        {
            string line = "";
            var nome = item.SelectSingleNode(".//h3/a").InnerText;
            var rating = item.SelectSingleNode(".//span[@class='rating']").InnerText;
            var price = item.SelectSingleNode("./div[2]/div[3]/div[2]/table/tbody/tr/td[4]/div/strong[1]");
            var discount = item.SelectSingleNode("./div[2]/div[3]/div[2]/table/tbody/tr/td[4]/div/div[1]");
            line = line + nome + "," + rating + "," + price + "," + discount;
            Console.WriteLine(line);
            output.WriteLine(line);
        }
    }
}

前两项(名称和评级)一切正常,但谈到价格和折扣时,我得到的结果是空的。我已经用 chrome scraper 分析了页面(这里是 link),它使用我使用的 xpath 很容易得到结果。我不明白我做错了什么。 任何帮助,将不胜感激! :D

【问题讨论】:

    标签: c# html web-scraping html-agility-pack


    【解决方案1】:

    快速浏览一下您要抓取的网页后,并非所有item 都有价格和折扣信息。您需要正确处理这种情况以避免异常,例如在获取InnerText 之前检查null。您的代码稍作更改就能够在可用的情况下获取价格和折扣信息:

    if (item != null && item.Attributes["data-recommended"] != null)
    {
        string line = "";
        var nome = item.SelectSingleNode(".//h3/a").InnerText;
        var rating = item.SelectSingleNode(".//span[@class='rating']").InnerText;
        var price = item.SelectSingleNode("./div[2]/div[3]/div[2]/table/tbody/tr/td[4]/div/strong[1]");
        var discount = item.SelectSingleNode("./div[2]/div[3]/div[2]/table/tbody/tr/td[4]/div/div[1]");
        //set priceString to empty string if price is null, else set it to price.InnerText
        var priceString = price == null ? "" : price.InnerText;
        //do similar step for discountString
        var discountString = discount == null ? "" : discount.InnerText;
        line = line + nome + "," + rating + "," + priceString + "," + discountString;
        Console.WriteLine(line);
        output.WriteLine(line);
    }
    

    【讨论】:

    • 感谢您的回答!我已经尝试过您的更改,但遗憾的是我仍然得到空的结果。我可以正确获取名称和评级,但是其他项目是空的,好像源页面中根本没有价格,而我可以看到有一些!为什么代码对你有用而不对我有用? :( :(
    • 它看起来好像只是不会读取表格内的内容......这可能吗?事实上,如果我尝试从主节点获取所有 HTML,我仍然没有得到价格或折扣......
    • 我的朋友!我找到了抢不到价格的原因!!如果您点击链接,则使用 Web.Load 加载的页面与您将访问的页面不同!我已经让程序将 web.load 中加载的页面下载为 HTML,然后我用浏览器打开它,页面不同,没有显示价格...为什么会发生这种情况?
    猜你喜欢
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    相关资源
    最近更新 更多