草庐IT

html - XPath 和 CSS 查询算法的区别

coder 2023-08-05 原文

我想知道为什么有人会想要使用 CSS 选择器而不是 XPath 选择器,反之亦然,如果他可以使用其中任何一个。我认为理解处理这些语言的算法将解决我的疑惑。

有很多关于 XPath 和 CSS 选择器的单独文档,但我发现很少有比较。另外,我不太使用 CSS 选择器。

这是我读到的关于差异的内容。 (这三个引用文献讨论了在 Selenium 中使用 XPath 和 CSS 选择器来查询 HTML,但我的疑惑是笼统的。)

看起来 CSS 选择算法以某种方式针对 HTML 进行了优化,但我不知道如何进行优化。

  1. 是否有关于 CSS 和 XPath 查询算法如何工作以及它们有何不同的论文?
  2. 我遗漏的语言之间是否存在其他抽象差异?

最佳答案

主要区别在于您的目标文档结构的稳定性:

  1. 当结构重要和/或稳定时,XPath 是一种很好的查询语言。您通常指定路径、条件、精确偏移量……它也是一种很好的检索一组相似对象的查询语言,正因为如此,它与 XQuery 有着密切的关系。此处文档具有稳定的结构,您必须检索重复/相似的部分

  2. CSS 选择器更适合 CSS 样式表。这些不关心文档结构,因为这个变化很大。想一想应用于网站所有 HTML 页面的一个 CSS 样式表。每个页面的内容和结构都不同。由于结构的变化,这里的 CSS 选择器更好。您会注意到访问更多是基于标签的。大多数 CSS 语法指定一组元素、属性、id、类……而不是它们的结构。在这里,您必须找到在文档结构中没有明确位置但标有特定属性的部分。


更新:仔细查看您的问题后,我意识到您对当前的实现更感兴趣,而不是查询语言的性质。在那种情况下,我不能给你你正在寻找的答案。我只能假设原因仍然是一个比另一个更依赖于结构。

例如,在 XPath 中,您必须跟踪您正在处理的文档的结构。另一方面,当特定标 checkout 现时,CSS 选择器会被触发,它之前出现的内容通常无关紧要。我可以想象实现一个在您阅读文档时工作的 CSS 选择器算法会容易得多,而 XPath 在更多情况下您确实需要完整的文档和/或严格跟踪它正在阅读的内容(因为历史和你正在阅读的内容的背景更重要)

现在,不要对我的更新太认真。我在这里只是猜测,因为我有一些语言解析方面的背景,但实际上我没有为数据查询设计的经验。

关于html - XPath 和 CSS 查询算法的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8140940/

有关html - XPath 和 CSS 查询算法的区别的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby - capybara field.has_css?匹配器 - 2

    我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No

  5. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  6. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  7. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  8. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  9. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  10. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

随机推荐