xxb*_*bcc 7 .net html c# parsing html-agility-pack
我需要LINK
和META
从ASP.NET页面,用户控件和母版页元素,抓住他们的内容,然后写回更新的值在公用事业我工作的这些文件.
我可以尝试使用正则表达式来获取这些元素,但这种方法存在一些问题:
SCRIPT
包含看起来像有效元素的注释和/或VBScript/JavaScript的元素等.META
和LINK
元素中的IE条件注释我在.NET中对HTML解析器进行了一些研究,许多SO帖子和博客都推荐了HTML Agility Pack.我以前从未使用它,我不知道它是否可以解析破碎的HTML和HTML片段.(例如,假设一个用户控件只包含一个包含HEAD
一些内容的元素 - 没有HTML
或BODY
.)我知道我可以阅读文档,但如果有人可以提供建议,它会节省很多时间.(大多数SO帖子都涉及解析完整的HTML页面.)
绝对是,这就是它擅长的.
事实上,由于缺少<html>
标签或不正确关闭的标签,您在野外发现的许多网页可能被描述为HTML片段.
HtmlAgilityPack模拟了浏览器必须做的事情 - 尝试从有时混乱的不匹配标签中弄清楚什么.一个不完美的科学,但HtmlAgilgityPack做得很好.
Html Agility Pack的替代品是CsQuery,一个C#jQuery端口,我是其主要作者.它允许您使用CSS选择器和完整的查询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();
Run Code Online (Sandbox Code Playgroud)
最后,CsQuery对类,id,属性和标记上的文档进行索引 - 与Html Agility Pack相比,使选择器的速度极快.