ruby - Mechanize 搜索无法找到 CSS 选择器(它肯定存在)

标签 ruby css-selectors nokogiri mechanize

我有一个很长的 CSS 选择器,在 CSS、jQuery 等中实际使用时它工作得很好。但是这个非常相同的选择器在 Mechanize::Page 上不起作用。 object - 它只是返回一个空数组。

选择器的目标是一个段落,在我的另一种情况下是一个 header1。我还使用 page.body 将我的页面结果转换为字符串,并且该元素肯定存在,但是 search (或 at )方法不会返回任何东西。

这可能是什么原因?

我的代码如下所示:

agent = Mechanize.new
page  = agent.get 'http://example.com'

page.search(source.read_more_selector).each do |read_more|
  inner_page = agent.get(read_more['href'])
  # displaying inner_page.body gives me a few valid HTML pages, but...

  inner_page.search(source.inner_title_selector).each do |inner_content|
    # but here, there's nothing here, inner_content is nil even though the selector should get us something back definitely
  end
end

正常工作的 CSS 选择器 ( source.inner_content_selector )
div#main-container-body > div#body-container > table > tbody > tr > td > span#ajaxprochoice > table > tbody > tr > td > table > tbody > tr > td > table > tbody > tr > td > div > h1.h1productHead
inner_page.body 的输出(众多循环结果之一。由于字符太多,无法在此处添加):

http://pastebin.com/MtXDVADR

所以上面的选择器应该肯定匹配 HTML 代码中的段落(当然,虽然它是一个 Mechanize::Page 对象,而不是一个字符串)和 inner_page.search ,但事实并非如此。

我转到实际的在线页面并打开我的控制台并运行这个简单的 jQuery 命令来尝试一下:
$('div#main-container-body > div#body-container > table > tbody > tr > td > span#ajaxprochoice > table > tbody > tr > td > table > tbody > tr > td > table > tbody > tr > td > div > h1.h1productHead').hide();

它奏效了!这几乎意味着选择器在这里有效。

编辑

当我添加这段代码时:
inner_page.at('.h1productHead').to_s

这给了我一个结果。但是当我使用完整的选择器时,它不会返回任何内容。为什么在这种情况下 Mechanize 对选择器不灵活?

最佳答案

您搜索的页面不包含任何 tbody标签。当您的浏览器解析页面时,它会添加缺少的 tbody元素到它创建的 DOM 中。这意味着当您通过浏览器的检查器和控制台检查页面时,它的作用类似于 tbody标签存在。

Nokogiri 在解析时没有添加这个标签。当您使用 Nokogiri 搜索您的查询(其中包含 tbody)时,它会查找显式 tbody标签,因此在找不到匹配项时不返回匹配项。

最简单的修复方法是删除所有 tbody s 来自您的查询(以及任何额外的 > s)。

您也可以查看 Nokogumbo , 用 Google’s Gumbo HTML5 parser 扩展了 Nokogiri ,并且确实添加了 tbody元素到已解析的文档中。

关于ruby - Mechanize 搜索无法找到 CSS 选择器(它肯定存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30959758/

相关文章:

html - 悬停 div 以显示另一个 div

ruby - 你如何在 ruby​​ 中反转顺序

ruby - 删除文件中第二个文件中没有匹配项的行的最快方法是什么?

ruby - Ruby 中 append 的反义词是什么? <<

javascript - 如何使用全局选择器响应除一个元素之外的所有点击事件?

javascript - 如何从 CSS 选择器中提取类名?

ruby - 如何使用 nokogiri 从 xml 文件中转储模式元素?

ruby-on-rails - Nokogiri 忽略 utf-8 设置

ruby - Nokogiri 如何获取带有换行符的 html 文本

ruby-on-rails - Vagrant -v 忽略 ffi -nokogiri 和 unf_ext 因为它的扩展没有构建