可以使用Html Agility Pack来解析HTML片段吗?

.net c# html html-agility-pack parsing

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

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

  • 我希望许多输入文件包含损坏的HTML(缺失/无序元素等)
  • 包含注释和/或VBScript / JavaScript的SCRIPT元素,看起来像有效元素等。
  • 我需要能够在IE条件注释中使用特殊情况IE条件注释和METALINK元素
  • 更不用说HTML如何不是常规语言

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

一般承认的答案

当然,这就是它擅长的。

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

HtmlAgilityPack模拟了浏览器必须做的事情 - 尝试从有时混乱的不匹配标签中弄清楚。一个不完美的科学,但HtmlAgilgityPack做得很好。


热门答案

Html Agility Pack的替代品是CsQuery ,一个C#jQuery端口,我是其主要作者。它允许您使用CSS选择器和完整的Query API来访问和操作DOM,对于许多人来说,这比XPATH更容易。此外,它的HTML解析器专门针对各种目的而设计,并且有几种解析HTML的选项:作为完整文档(缺少html, body将添加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相比,使选择器的速度极快。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因