【问题标题】:Html Agility Pack get contents from tableHtml Agility Pack 从表中获取内容
【发布时间】:2014-06-26 00:54:46
【问题描述】:

我需要从“http://anytimefitness.com/find-gym/list/AL”获取位置、地址和电话号码到目前为止我有这个......

    HtmlDocument htmlDoc = new HtmlDocument();

    htmlDoc.OptionFixNestedTags = true;
    htmlDoc.LoadHtml(stateURLs[0].ToString());

    var BlankNode = 
        htmlDoc.DocumentNode.SelectNodes("/div[@class='segmentwhite']/table[@style='width: 100%;']//tr[@class='']");

    var GrayNode = 
        htmlDoc.DocumentNode.SelectNodes("/div[@class='segmentwhite']/table[@style='width: 100%;']//tr[@class='gray_bk']");

我已经查看了 stackoverflow 一段时间,但目前关于 htmlagilitypack 的帖子都没有真正有帮助。我也一直在用http://www.w3schools.com/xpath/xpath_syntax.asp

【问题讨论】:

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


    【解决方案1】:

    由于<div> 不是根节点的直接子节点,因此您需要使用// 而不是/。然后,您可以使用 or 运算符为 BlankNodeGrayNode 组合 XPath,例如:

    var htmlweb = new HtmlWeb();
    HtmlDocument htmlDoc = htmlweb.Load("http://anytimefitness.com/find-gym/list/AL");
    htmlDoc.OptionFixNestedTags = true;
    
    var AllNode =
            htmlDoc.DocumentNode.SelectNodes("//div[@class='segmentwhite']/table//tr[@class='' or @class='gray_bk']");
    foreach (HtmlNode node in AllNode)
    {
        var location = node.SelectSingleNode("./td[2]").InnerText;
        var address = node.SelectSingleNode("./td[3]").InnerText;
        var phone = node.SelectSingleNode("./td[4]").InnerText;
    
        //do something with above informations
    }
    

    【讨论】:

    • 我在 foreach 循环中得到了 NullReferenceException。它声明 AllNode 为空。
    • 感谢您的帮助!
    【解决方案2】:

    这是我在LinqPad 中测试的示例。

    string url = @"http://anytimefitness.com/find-gym/list/AL";
    var client = new System.Net.WebClient();
    var data = client.DownloadData(url);
    var html = Encoding.UTF8.GetString(data);
    
    var htmlDoc = new HtmlAgilityPack.HtmlDocument();
    htmlDoc.OptionFixNestedTags = true;
    htmlDoc.LoadHtml(html);
    
    var gyms = htmlDoc.DocumentNode.SelectNodes("//tbody/tr[@class='' or @class='gray_bk']");
    foreach (var gym in gyms) {
        var city = gym.SelectSingleNode("./td[2]").InnerText;
        var address = gym.SelectSingleNode("./td[3]").InnerText;
        var phone = gym.SelectSingleNode("./td[4]").InnerText;
    }
    

    由于 HtmlAgilityPack 也支持 Linq,您还可以执行以下操作:

    string [] classes = {"", "gray_bk"};
    
    var gyms = htmlDoc
            .DocumentNode
            .Descendants("tr")
            .Where(t => classes.Contains(t.Attributes["class"].Value))
            .ToList();
    
    gyms.ForEach(gym => {
        var city = gym.SelectSingleNode("./td[2]").InnerText;
        var address = gym.SelectSingleNode("./td[3]").InnerText;
        var phone = gym.SelectSingleNode("./td[4]").InnerText;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多