是否有可以在 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 选择器?的主要内容,如果未能解决你的问题,请参考以下文章
是否有类似 jQuery 的 Java XML 解析选择器?
是否有任何 jquery 功能可以以与 DOM 类似的方式查询多维数组?