使用 html 敏捷包抓取表数据

Posted

技术标签:

【中文标题】使用 html 敏捷包抓取表数据【英文标题】:Scraping table data with htmlagility pack 【发布时间】:2014-03-20 07:14:19 【问题描述】:

我有一张如下表。我想抓取该表每一行的第 1 列和第 4 列。

表格的结构是这样的:

每个数据都有一个b标签

我尝试过这样的事情。但我没有得到我的结果

 htmlWeb web = new HtmlWeb();
 HtmlAgilityPack.HtmlDocument doc = web.Load("http://www.islam4you.info/contents/names/ma.php");
 HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//b");


 double k = 5;

 try
 
     foreach (HtmlNode n in nodes)
     
                
        if (k != 0)
        
          if ((k % 5) == 1)
          
              link = n.InnerHtml;
              nam_list.Add(link);
          

          if ((k % 5) == 4)
          

              link = n.InnerHtml;
              meng_list.Add(link);
          
         
         k++;
       
  
  catch (NullReferenceException)
  
       MessageBox.Show("No link found");
  

如何从该表中获取第一列和第四列的数据???

【问题讨论】:

请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标记用于此目的。 【参考方案1】:
var table = doc.DocumentNode.SelectNodes("//table[@bordercolor='#111111'][1]")
                .Descendants("tr")
                .Select(tr => tr.Descendants("td").Select(td => td.InnerText).ToList())
                .Where(x => x.Count() == 5)
                .ToList();

【讨论】:

【参考方案2】:

这听起来可能有点矫枉过正,但我​​认为在这种情况下使用库会更好。只是为了维护更好。

看看使用CsQuery 有多容易

[TestFixture]
public class HtmlParse

    [Test]
    public void Test()
    

        var dom =
            CQ.Create(
                @"<table><tbody> <tr><td><b>Aadam</b></td></tr> <tr><td></td></tr> <tr><td></td></tr> <tr><td></td></tr> <tr><td><b>Earth</b></td></tr></tbody></table>");

        var results = dom["table tr:nth-child(1) b, table tr:nth-child(5) b"];

        foreach (var result in results)
        
            Console.WriteLine(result.InnerText);
        
    


【讨论】:

以上是关于使用 html 敏捷包抓取表数据的主要内容,如果未能解决你的问题,请参考以下文章

HTML 敏捷包 - 解析表

HTML 敏捷包

使用 XML 包将 html 表抓取到 R 数据帧中

OSPF的基本配置 之 抓取消息数据包 和 三张表信息的查看

使用Wireshark mac下抓取分析iphone数据包 --IOS端

使用 XML / RCurl R 包解析 HTML 表,而不使用 readHTMLTable 函数