【问题标题】:Parse Table presented in WebControlWebControl 中呈现的解析表
【发布时间】:2012-08-21 18:55:55
【问题描述】:

HTML 正在使用内置 WebControl 的 WinForm 中显示

我决定试试 HTMLAgilityPack。

var query = from table in doc.DocumentNode.SelectNodes("//table[@class='TABLEBORDER').Cast<HtmlNode>() 
            from row in table.SelectNodes("tr").Cast<HtmlNode>() 
            from cell in row.SelectNodes("th|td").Cast<HtmlNode>() 
            select new {Table = table.Id, CellText = cell.InnerText}; 

foreach(var cell in query) { 
    Console.WriteLine("{0}: {1}", cell.Table, cell.CellText); 
} 

我根据@L.B 更新了代码 我得到以下输出

The thread '<No Name>' (0x1e94) has exited with code 0 (0x0).
: 
Target

: 
Triggerenabled?

: 
Account

: 
Passwordchanged?


: 
Error message(if any)

The thread '<No Name>' (0x2564) has exited with code 0 (0x0).

其他数据在 webcontrol 上清晰可见。

【问题讨论】:

  • 如果您想在不使用任何 3rd 方代码的情况下解析重要的 HTML,那么您将陷入困境。您可能可以使用一些复杂的正则表达式或一些丑陋的子字符串搜索/提取代码来做到这一点。但它会很脆弱,很难维护。另一种选择是编写您自己的更通用的 HTML 解析器,这将花费您数年的时间。解析 HTML 很难做到正确,除非您有非常令人信服的理由不这样做,否则我会使用已经完成的东西。
  • 在这个时代,没有第 3 方插件让我觉得这是不合理的要求。这是什么原因? HTML5 数据属性加上一点 jQuery 就可以轻松解决这个问题。
  • 我认为在互联网出现之前这只是一个合理的要求;)为什么要重新发明可以回收的东西?
  • 我过去尝试过WATIN,发现IE需要Admin privs来解析html。所以我放弃了WATIN。我需要一些非管理员可以用来执行数据输入的东西(我使用 webControl1.Document.GetElement 完成了所有数据输入...
  • .. 你到底想做什么?听起来,也许是自动填写表单(在其他人的网站上)和/或使用浏览器控件从 winforms 应用程序中抓取?

标签: c# linq html-parsing dom


【解决方案1】:

该页面还有其他表,但我只对类为“TABLEBORDER”的表感兴趣。

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var table = doc.DocumentNode.SelectSingleNode("//table[@class='TABLEBORDER']");

编辑

var res = table.Descendants("tr")
               .Select(tr => tr.Descendants("td")
                               .Select(td => td.InnerText)
                               .ToList())
               .ToList();

EDIT2

foreach (List<string> tr in res)
{
    foreach (string td in tr)
    {
        Console.Write("[{0}] ", td);
    }
    Console.WriteLine();
}

【讨论】:

  • 我刚试过这个,我得到了 TH 输出。我没有看到 td 值。
  • 谢谢。我对 LINQ 很陌生。数据是否存储在 res 中?
  • @CocoaDev 是的,它是List&lt;List&lt;string&gt;&gt;
  • 我添加了 2 行代码,我对列表感到困惑。
猜你喜欢
  • 2020-03-16
  • 2010-12-13
  • 2011-01-11
  • 2012-05-14
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多