是否有类似于jQuery的CSS/HTML选择器可以在C#中使用?

68

我想知道是否有类似于jQuery的CSS选择器可以在C#中使用。

目前,我正在使用正则表达式解析一些HTML字符串,并认为使用类似于jQuery中的CSS选择器来匹配我需要的元素会更好。


所以,我猜目前还没有类似的东西。 - Dave
XPath查询不符合您的需求吗?使用XML或HTML解析器将字符串加载到DOM对象中,并根据您喜欢的任何内容查询元素。就像jQuery一样。 - patjbs
如果您想要一种更易于查找的查询结构,您尝试过使用linq查询吗? - patjbs
5个回答

81

更新于2012年10月18日

CsQuery现在发布了1.3版本。最新版本包含validator.nu HTML5解析器的C#端口。因此,CsQuery现在将产生一个使用HTML5规范处理无效标记的DOM,并且完全符合标准。

原回答

虽然这是一道老问题,但我有了新答案。我最近发布了CsQuery 1.1版本,这是我用C#编写的适用于.NET 4的jQuery移植版,我已经花了大约一年的时间进行开发。同时,在NuGet上也提供了名为"CsQuery"的安装包。

当前版本实现了所有CSS2和CSS3选择器、所有jQuery扩展以及所有jQuery DOM操作方法。它有广泛的测试覆盖,包括所有来自jQuery和sizzle(jQuery CSS选择引擎)的测试。我还包括了一些性能测试,以便和Fizzler进行直接比较;在大多数情况下,CsQuery的性能远优于Fizzler。不过,Fizzler更快的地方实际上是在首次加载HTML时;我认为这是因为Fizzler不建立索引。然而,在第一次选择之后,您将获得这些时间的回报。

在github网站上有相关文档,但基本上它的使用方法如下:

从HTML字符串创建

CQ dom = CQ.Create(htmlString);

从网络同步加载

CQ dom = CQ.CreateFromUrl("http://www.jquery.com");

异步加载(非阻塞)

CQ.CreateFromUrlAsync("http://www.jquery.com", responseSuccess => {
    Dom = response.Dom;        
}, responseFail => {
    ..
});

运行选择器并执行jQuery操作

var childSpans = dom["div > span"];
childSpans.AddClass("myclass");

CQ对象类似于jQuery对象。上面使用的属性索引器是默认方法(就像$(...)一样)。

输出:

string html = dom.Render();

刚刚为此添加了一个测试,它已经正确地将类中的任何空格解释为分隔符。所以答案是肯定的。 - Jamie Treworgy
3
顺便问一下,你为什么要关闭所有旧的问题,这些问题都是在问"c#是否有jquery端口",因为我回答了它,现在已经有答案了,这是有原因的吗?不管你是否认为这个问题适合在SO上提出,它已经存在多年,并且在谷歌搜索中高居榜首。我希望人们能够找到它。现在关闭它似乎有点报复性,唯一的后果就是这个项目(免费、实用、MIT许可证),直到最近才完整存在,将会有更少的曝光率。 - Jamie Treworgy
1
好吧,我想这是你的决定,我认为你使用“法律条文”来阻碍我让人们了解这个项目的努力太糟糕了。我不到一天就回答了这个问题,并已经得到了两个赞,所以我想人们发现它很有用,即使你没有。明天它将从SO上消失,真可惜。 - Jamie Treworgy
它说“发布好的、相关的回答,如果其中一些(但不是全部)恰好与您的产品或网站有关,那就这样吧”。多年来,我已经回答了数百个与我的项目无关的问题(无论是产品还是网站)。我认为我的答案符合“好和相关”,包括示例代码和详细信息,而且我肯定披露了我的从属关系。这个指令显然是面向商业利益的。这不是一个商业利益,我绝对不是垃圾邮件发送者,我认为您可以通过查看我的 SO 历史来验证这一点。 - Jamie Treworgy
CsQuery不再维护。作者建议考虑使用AngleSharp https://github.com/AngleSharp/AngleSharp - Jeroen K
显示剩余5条评论

72

你肯定应该看一下 @jamietre 的 CsQuery。查看他对这个问题的回答!

FizzlerSharp-Query 提供类似的功能,但这些项目似乎已被放弃。


请注意:Sharp Query 是 GPL 许可的。Fizzler 是 LGPL 许可的,更加商业友好。 - nakhli
看起来 Fizzler 已经测试版两年了,没有任何活动。 Sharp-Query 也不太好,状态不明确。 - Jeroen K
5
请考虑给 @jamietre 的回答点赞,而不是我的。他有一个很棒的解决方案! - Andy S
csquery不再维护 - Toskan

2

2
是的...我几天前刚看过HTML Agility Pack。但是,它仍然使用XPath进行匹配。并不是说我不喜欢XPath。但是,在我看来,CSS选择器语法的清晰度要好得多。 - Dave
LINQ-to-Objects可能是我会使用的。但没错 - 不像选择器那样简洁。 - Daniel

1

对于 XML,您可以使用 XPath...


哦,是的,我忘了提到。我想要像CSS选择器一样简单明了的东西。 - Dave
4
如果你希望使用XPath来处理可能不符合规范的HTML,可以尝试使用HTML Agility Pack。http://htmlagilitypack.codeplex.com/ - Travis P
后来我开始使用CsQuery,现在更喜欢它。 - Frank Schwieterman

1

我不是完全清楚你想要实现什么,但如果你有一个HTML文档,想从中提取数据,我建议使用解析器加载它,然后查询对象以提取所需元素就变得相当简单。

我上面提供的解析器允许使用XPath查询,这听起来像是你正在寻找的。

如果我误解了,请告诉我。


请问您指的是哪个解析器?我只想要像 Doc.select("div.foo") 这样的东西,返回所有具有 class 为 foo 的 div 元素。 - Dave
我在文本中添加了一个链接,指向一个关于解析HTML的SO问题。特别是,我过去使用的HTML Agility包解析器可以成功地加载HTML文档并对其进行查询。 - patjbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接