7

我需要从 ASP.NET 页面、用户控件和母版页中获取LINK元素META,获取它们的内容,然后在我正在使用的实用程序中将更新的值写回这些文件。

我可以尝试使用正则表达式来获取这些元素,但这种方法存在几个问题:

  • 我希望许多输入文件包含损坏的 HTML(缺少/乱序元素等)
  • SCRIPT包含注释的元素和/或看起来像有效元素的 VBScript/JavaScript 等。
  • 我需要能够对 IE 条件注释和 IE 条件注释中的META元素LINK进行特殊处理
  • 更不用说HTML如何不是常规语言

我对 .NET 中的 HTML 解析器进行了一些研究,许多 SO 帖子和博客都推荐HTML Agility Pack。我以前从未使用过它,我不知道它是否可以解析损坏的 HTML 和 HTML 片段。(例如,假设一个用户控件只包含一个HEAD元素,其中包含一些内容 - 没有HTMLBODY。)我知道我可以阅读文档,但如果有人可以提供建议,它会为我节省很多时间。(大多数 SO 帖子都涉及解析完整的 HTML 页面。)

4

2 回答 2

5

没错,这就是它擅长的地方。

<html>事实上,由于缺少标签或未正确关闭的标签,您会在野外发现的许多网页都可能被描述为 HTML 片段。

HtmlAgilityPack 模拟浏览器必须做的事情 - 尝试从有时混乱的不匹配标签中理解。一门不完美的科学,但 HtmlAgligityPack 做得很好。

于 2012-09-21T14:42:05.530 回答
5

Html Agility Pack 的替代方案是CsQuery,一个 C# jQuery 端口,我是它的主要作者。它允许您使用 CSS 选择器和完整的 Query API 来访问和操作 DOM,这对许多人来说比 XPATH 更容易。此外,它的 HTML 解析器是专为多种目的而设计的,并且有多种解析 HTML 的选项:作为完整文档(html, body将添加缺少的标签,并将任何孤立的内容移动到正文中);作为一个内容块(意思是 - 它不会被包装为一个完整的文档,但是可选的标签,如tbody在 DOM 中仍然是强制性的,就像浏览器一样),并且作为一个真正的片段,没有标签被创建(例如,如果您只是使用构建块)。

有关详细信息,请参阅创建新 DOM

此外,CsQuery 的 HTML 解析器被设计为遵循 HTML5 规范的可选结束标记。例如,关闭p标签是可选的,但有特定的规则可以确定何时关闭块。为了生成与浏览器相同的 DOM,解析器需要实现相同的规则。CsQuery 这样做是为了提供与给定源的浏览器 DOM 的高度兼容性。

使用 CsQuery 非常简单,例如

CQ docFromString = CQ.Create(htmlString); 
CQ docFromWeb = CQ.CreateFromUrl(someUrl);

// there are other methods for asynchronous web gets, creating from files, streams, etc.

// css selector: the indexer [] is like jQuery $(..)

CQ lastCellInFirstRow = docFromString["table tr:first-child td:last-child"];

// Text() is a jQuery method returning text contents of selection 

string textOfCell = lastCellInFirstRow.Text();

最后,CsQuery 根据类、id、属性和标签对文档进行索引 - 与 Html Agility Pack 相比,选择器的速度非常快。

于 2012-09-21T15:00:29.107 回答