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

Posted

技术标签:

【中文标题】是否有可以在 C# 中使用的类似 jQuery 的 CSS/HTML 选择器?【英文标题】:Is there a jQuery-like CSS/HTML selector that can be used in C#? 【发布时间】:2010-12-07 12:40:46 【问题描述】:

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

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

【问题讨论】:

所以,我想目前没有这样的 XPath 查询如何不能满足您的需求?使用 XML 或 HTML 解析器将字符串加载到 DOM 对象中,并根据您喜欢的任何内容查询元素。就像 jQuery。 如果您想要一个更易于 grep 查询结构,您是否尝试过使用 linq 查询? 【参考方案1】:

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

【讨论】:

哦,是的,我忘了提这个。我想要类似 css 选择器的东西,因为它简单明了。 如果您想将 XPath 与可能格式不正确的 HTML 一起使用,请查看 HTML Agility Pack。 htmlagilitypack.codeplex.com 后来我开始使用 CsQuery,现在更喜欢它了。【参考方案2】:

我不完全清楚您要实现的目标,但如果您有一个要从中提取数据的 HTML 文档,我建议您使用 parser 加载它,然后查询对象以提取所需元素变得相当简单。

我上面链接的解析器允许使用 XPath 查询,这听起来像您正在寻找的。​​p>

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

【讨论】:

我可以知道您指的是什么解析器吗?我只想要像 Doc.select("div.foo") 之类的东西来返回所有作为 div 并且具有类 foo 的元素。 我添加了一个指向文本的链接,它指向一个关于解析 HTML 的 SO 问题。特别是,我过去使用的 HTML Agility 包解析器加载 HTML 文档并对其进行查询非常成功。【参考方案3】:

不太像 jQuery,但这可能会有所帮助: http://www.codeplex.com/htmlagilitypack

【讨论】:

是的...几天前我刚刚查看了 html 敏捷包。但是,它仍然使用 XPath 进行匹配。并不是我不喜欢 XPath。但是,在 imo 中,css 选择器语法的简洁性要好得多。 LINQ-to-Objects 可能是我会使用的。但没错 - 不像选择器那么干净。【参考方案4】:

您绝对应该看到@jamietre 的CsQuery。看看他对这个问题的回答!

Fizzler 和 Sharp-Query 提供类似的功能,但项目似乎已被放弃。

【讨论】:

请注意:尖锐查询是 GPL。 Fizzler 是 LGPL,对商业更友好。 看起来 Fizzler 是 2 年的测试版,没有任何活动。 Sharp-Query 也好不了多少,状态不明。 请考虑支持@jamietre 的回答而不是我的回答。他有一个绝妙的解决方案! csquery 不再维护【参考方案5】:

2012 年 10 月 18 日更新

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

原答案

老问题,但新答案。我最近发布了 CsQuery 1.1 版,这是一个用于 .NET 4 的 jQuery 端口,用 C# 编写,我已经研究了大约一年。同样在NuGet 上作为“CsQuery”

当前版本实现了所有 CSS2 和 CSS3 选择器、所有 jQuery 扩展以及所有 jQuery DOM 操作方法。它具有广泛的测试覆盖率,包括来自 jQuery 和 sizzle(jQuery CSS 选择引擎)的所有测试。我还包含了一些与 Fizzler 直接比较的性能测试;在大多数情况下,CsQuery 的性能大大优于它。例外实际上是在 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();

【讨论】:

您是否处理有换行符、换行符和制表符作为分隔类名的空格的情况? 刚刚为此添加了一个测试,它已经正确地将类中的任何空格解释为分隔符。所以答案是肯定的。 感谢您的信息。不幸的是,这个问题是 NC,但我已经多次遇到这个特定问题。 顺便说一句,您是否有某些原因要关闭所有询问“c# 是否有 jquery 端口”的旧问题,因为我已经回答了它,差不多三年后,现在有是?无论您是否同意这个问题对 SO 来说是一个好问题,它已经存在多年,并且在谷歌搜索该问题时出现的频率很高。我希望人们能够找到这个。现在关闭它似乎有点报复。唯一的后果是,这个免费、有用且获得 MIT 许可且直到最近才以完整形式存在的项目的曝光率将会降低。 好吧,我想这是你的电话,我认为你使用“法律条文”来阻碍我让人们了解这个项目的努力太糟糕了。我在不到一天前就回答了这个问题,并且已经获得了两次赞成票,所以我猜人们发现它很有用,即使你不是。太糟糕了,它明天就会从 SO 中消失。

以上是关于是否有可以在 C# 中使用的类似 jQuery 的 CSS/HTML 选择器?的主要内容,如果未能解决你的问题,请参考以下文章

有没有用 C# 编写的类似 jQuery 的库? [关闭]

在 C# 中使用 Jquery 自动完成

是否有类似 jQuery 的 Java XML 解析选择器?

是否有任何 jquery 功能可以以与 DOM 类似的方式查询多维数组?

C# 中是不是有 Sizzle/jQuery 选择器实现? [关闭]

在 Python 中进行类似 jquery 的 HTML 解析?