2012-05-05 52 views
2

在DotNet世界中是否存在類似jQuery的html元素選擇器庫?我正在構建一個涉及大量html解析的應用程序。HTML選擇器庫

假設我想枚舉所有'href和'src的內部只有一個選定的'div的ID爲「post_message_%」的ID。 或者說要選擇具有特定ID或輸入類型(如隱藏或無線電)的表格中的名稱和值字符串

我可以編寫代碼..但首先尋找任何現有的解決方案,以便我可以使用它,並節省我的時間去做其他事情。

+1

有HTML敏捷包或Sgml讀者。您可以使用XPath查詢語法。 –

回答

4

你應該看看Html Agility包,可用here。 下面是從他們的網站的使用情況,使用XPath選擇:

HtmlDocument doc = new HtmlDocument(); 
doc.Load("file.htm"); 
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"]) 
{ 
    HtmlAttribute att = link["href"]; 
    att.Value = FixLink(att); 
} 
doc.Save("file.htm"); 
+0

敏捷包,是的,我聽到這個名字。感謝您的快速回復,我現在檢查...歡迎任何更多的建議... –

+0

@PrasenjitChatterjee,我已經研究了大約一個月前的事情,HtmlAgilityPack是最好的選擇,我坦率地沒有就像BeautifulSoup一樣,這很遺憾只能用於Python。我不確定它是否適用於IronPython,但如果你有時間檢查一下。 – Gleno

+0

謝謝,我之前使用過python,並熟悉語法和風格......但主要是我在3.x版本上工作......不幸的是,所有這些庫仍然使用2.x版本......但我一定會牢記它如果可能在我的產品的後期版本中,我會加入它。 –

4

有點太遲了,但這裏的另一種選擇。 CsQuery是.NET4中完整的jQuery端口。它在NuGet上爲CsQuery。它穩定且功能完整,包括所有CSS3選擇器和DOM操作方法。它也被完全索引,使得選擇器的數量級比HTML敏捷包快幾個數量級。

的語法如下所示(複製上面的例子)

CQ doc = CQ.CreateFromFile("file.htm"); 
foreach (IDomObject link in doc["a"]) { 
    var attr = link["href"]; 
    link["href"] = FixLink(attr); 
} 

用於CQ對象的屬性索引語法是相同的作爲默認的jQuery方法運行的選擇器,例如$('a')。在DomObject(一個元素)它返回屬性值。

除了CSS選擇器,CsQuery也實現了所有的jQuery方法,所以你可以這樣做的:

doc.Each((i,e)=> { 
    var el = CQ.Create(e); // or shorthand: var el = e.Cq() 
    el.Attr("href",FixLink(el.Attr("href")) 
}); 

語法e.Cq()是一個jQuery對象包裝的元素,像var el = $(e)的C#版本。由於$語法的值是簡潔的,並且無法在C#中創建默認靜態方法,因此元素上的方法Cq()以簡寫形式提供以包裝CQ對象中的元素。