【问题标题】:Nokogiri isn't picking up direct descendant link tags in CSS selectors [closed]Nokogiri 没有在 CSS 选择器中选择直接后代链接标签 [关闭]
【发布时间】:2020-06-20 12:32:37
【问题描述】:

我在 Ruby on Rails 应用程序中使用 Nokogiri gem,遇到了一个奇怪的问题。这是我正在处理的 HTML 树:

在父 HTML 文档上使用 Nokogiri,我可以像这样成功地遍历树:

y[0].css("div.postContainer.opContainer div.post.op")[0]['id']
#  => "p25273352"

y[0].css("div.postContainer.opContainer div.post.op")[0].css(" > div").length
#  => 3

y[0].css("div.postContainer.opContainer div.post.op")[0].css(" > blockquote").length
#  => 1

但是,当我尝试对 aspan 标记执行相同操作时,它找不到任何直系后代:

y[0].css("div.postContainer.opContainer div.post.op")[0].css(" > a").length
=> 0

y[0].css("div.postContainer.opContainer div.post.op")[0].css(" > span").length
#  => 0

感觉我必须在这里遗漏一些明显的东西,但无法弄清楚。有什么想法吗?

【问题讨论】:

标签: ruby-on-rails ruby css-selectors nokogiri


【解决方案1】:

我觉得你太难​​了。

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
  <div class="a b">
    <div></div>
    <span>foo</span>
    <a href="http://example.com/">bar</a>
  </div>
EOT
doc.at('div.a span').to_html   # => "<span>foo</span>"
doc.at('div.a a').to_html      # => "<a href=\"http://example.com/\">bar</a>"

或:

doc.at('div.a > span').to_html # => "<span>foo</span>"
doc.at('div.a > a').to_html    # => "<a href=\"http://example.com/\">bar</a>"

我将使用at 而不是css("blah")[0]css("blah").first 访问子跨度/a 节点:

来自教程:

如果您知道您只会返回一个结果,您可以使用快捷方式 at_cssat_xpath 而不必访问 NodeSet 的第一个元素。

@doc.css("dramas name").first # => "<name>The A-Team</name>"
@doc.at_css("dramas name")    # => "<name>The A-Team</name>"

atat_cssat_xpath 的通用版本,接受 CSS 或 XPATH 选择器。

真正的 HTML 有可能被破坏,这可能会导致解析时定位节点出现问题。请参阅errors 方法。永远不要相信浏览器对 HTML 的看法。浏览器会修复损坏的 HTML,基本上会像 Nokogiri 那样重写它,但他们可能会做不同的事情。相反,请始终在命令行中使用 wgetcurlnokogiri 查看您的 HTML。

【讨论】:

    【解决方案2】:

    感觉我必须在这里遗漏一些明显的东西,但无法弄清楚。有什么想法吗?

    JavaScript。

    您发布了一个看起来像 Chrome 控制台的屏幕截图。 JavaScript 在浏览器中运行并会修改 DOM,可能会添加/删除 HTML 元素。

    您的 Ruby 代码很可能没有在 Chrome 中运行。检查页面源 (Ctrl+U) 或转储您使用 Ruby HTTP 客户端获得的响应,并确保您尝试使用 Nokogiri 获取的元素确实存在。

    【讨论】:

    • “很可能没有在 Chrome 中运行...”? Ruby 代码无法在浏览器中运行。
    • @theTinMan O'RLY? github.com/opal/opal(此外,可以使用无头 Chrome 进行一些设置,但无论如何)
    • 那是 JavaScript,不是运行 Ruby。
    • @theTinMan 对,JRuby 是 Java,而不是运行 Ruby?
    • 屏幕截图是 Nokogiri 正在抓取的页面的 Chrome 检查器。它不是 Rails/Nokogiri 应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2016-07-24
    • 2018-06-22
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多