ruby - ruby 脚本中的 CSS 选择器和条件

标签 ruby css-selectors nokogiri

我正在尝试用 Ruby 编写脚本来使用 Nokogiri 和 CSS 选择器解析维基百科文章。不过,我对脚本中的条件有些困惑。这是我目前所拥有的(page 是使用 Nokogiri 下载的 html):

page.css('h3').each do |node|
  puts node.text
end

page.css('li').each do |node|   
  if /\d|\D/.match(node)
    puts node.text.scan(/[\d]+\D*/).first
  end
end

page.css('td b').each do |node|
  puts node.text
end

一切正常。然而,我真正想要的是这样的:

page.css('h3, li, td b').each do |node|
  # if it's an h3 node, do one thing
  # if it's a li node, do another thing
  # else if it's a 'td b' node, do another thing
end

这将允许按顺序解析页面,而不是通过三个单独的主体。但是,我不确定如何在我的脚本中编写这些条件。

编辑: 所以现在我的脚本是

page.css('h3, li, td b').each do |node|
        case node.name
        when 'h3', 'b'
            puts node.text
        when 'li'
            if /\d|\D/.match(node)
                puts node.text.scan(/[\d]+\D*/).first
            end
        else
            next
    end
end

但是,它并没有改变行为。它以与之前相同的顺序处理它们(所有“h3”元素,然后是所有“li”元素,然后是所有“b”元素)。

编辑 2:

好吧,我终于让它工作了。这是我的最后一组条件:

page.traverse do |node|
    case
            when 'h3' == node.name 
            puts node.text
        when 'li' == node.name 
            puts node.text.scan(/[\d]+\D*/).first if /\d|\D/.match(node)
        when 'b' == node.name
            puts node.text if (node.parent.name == 'p' or node.parent.name == 'td')
    end
end

谢谢!

最佳答案

您可能正在寻找遍历:

page.traverse do |node|
  case
    when ['h3', 'li'].include?(node.name) then puts node.text
    when 'b' == node.name && 'td' == node.parent.name then puts node.text[/\d+\D*/]
  end
end

关于ruby - ruby 脚本中的 CSS 选择器和条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10661222/

相关文章:

ruby - 如何使用 Nokogiri 从 HTML 解析多个字符串?

ruby - 使用 Nokogiri 的 XML Builder 添加命名空间

ruby-on-rails - 使用 Ruby 1.9.3 的 Windows 8 x64 上的 nokogiri gem 缺少 libxml2

ruby-on-rails - Rails 迁移生成器不生成列

ruby - 为什么 ruby​​ Pathname#basename 返回前缀为 "Pathname:"的文件名?

ruby - 如何在 Ruby 中生成 a 和 b 之间的随机数?

xpath - selenium findElement 通过 By.id 之外的其他东西

ruby - 数据库连接池

css - 是否有模拟 CSS4 :blank selector? 的 css 技巧

html - 如何在 html 标记后定位 <span> 元素?