【问题标题】:Try to get a possibly existing HTML tag尝试获取可能存在的 HTML 标记
【发布时间】:2015-06-29 04:50:45
【问题描述】:

我正在使用 Nokogiri 解析一些 HTML:

  doc = Nokogiri::HTML(open(url))
  doc.css('.blockGroup--posts .block')[2..30].each do |article|
    title = article.at('h2').text # or h3, h4
    image = article.at('.section-content img')['src']  # may not exist

问题是有时标题可能会出现在h2h4标签中,所以

title = article.at('h2').text

会报告

undefined method `text' for nil:NilClass

image 也是如此。有时候文章没有图片,也会报错。

如何让 Nokogiri 获得这些元素并继续运行?或者如果这些元素不存在,我可以使用回调吗?

【问题讨论】:

  • 欢迎来到 Stack Overflow。请提供与您的问题相匹配的最小 HTML 示例。这有助于我们帮助您。不这样做会浪费我们的时间,因为我们试图从头开始创造一些东西。 “寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题是没有用的给其他读者。见:How to create a Minimal, Complete, and Verifiable example。”

标签: ruby-on-rails ruby exception-handling nokogiri


【解决方案1】:

很简单,你可以一直这样try

title = article.at('h2').try(:text) || "your any alternative methods can be called here"

图像也可以相同。

try 将返回 nil 或值,它将帮助您避免引发异常。

【讨论】:

  • 但是如何在h2/h3/'h4' 之间切换呢?它的标题可能出现在其中任何一个中。
  • 我该如何尝试['src']
  • 不是这种方式..您可以尝试查看节点是否不为零,然后您可以检查 [..]
【解决方案2】:

你可以这样做:

title = article.at('h2,h3,h4').text

【讨论】:

  • 如果没有h2h3h4 标签,这仍然会引发异常。添加尾随rescue nilrescue '' 将处理该问题,否则有必要在尝试text 之前检查at 是否返回nil
  • 您通常需要例外。这意味着您的假设(标题始终在 h[2-4] 中)是错误的,您需要重新评估。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 2018-12-06
相关资源
最近更新 更多