我想在Ruby中編寫腳本來使用Nokogiri和CSS選擇器來分析維基百科文章。儘管我對腳本中的條件有點困惑。這裏是我到目前爲止(page
是利用引入nokogiri下載的HTML):紅寶石腳本中的CSS選擇器和條件
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
謝謝!
正如下面馬克指出,但絕對沒有錯,你有什麼,現在,讓他們分開比結合他們更好。 –