gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:50 26 4
gpt4 key购买 nike

我正在尝试用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com