可以使用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合法嗎? 是的,了解原因