gpt4 book ai didi

ruby-on-rails - Nokogiri:选择元素 A 和 B 之间的内容

转载 作者:数据小太阳 更新时间:2023-10-29 07:21:54 25 4
gpt4 key购买 nike

让 Nokogiri 选择开始和停止元素(包括开始/停止元素)之间的所有内容的最聪明的方法是什么?

查看下面的示例代码以了解我在寻找什么:

require 'rubygems'
require 'nokogiri'

value = Nokogiri::HTML.parse(<<-HTML_END)
"<html>
<body>
<p id='para-1'>A</p>
<div class='block' id='X1'>
<p class="this">Foo</p>
<p id='para-2'>B</p>
</div>
<p id='para-3'>C</p>
<p class="that">Bar</p>
<p id='para-4'>D</p>
<p id='para-5'>E</p>
<div class='block' id='X2'>
<p id='para-6'>F</p>
</div>
<p id='para-7'>F</p>
<p id='para-8'>G</p>
</body>
</html>"
HTML_END

parent = value.css('body').first

# START element
@start_element = parent.at('p#para-3')
# STOP element
@end_element = parent.at('p#para-7')

结果(返回值)应该是这样的:

<p id='para-3'>C</p>
<p class="that">Bar</p>
<p id='para-4'>D</p>
<p id='para-5'>E</p>
<div class='block' id='X2'>
<p id='para-6'>F</p>
</div>
<p id='para-7'>F</p>

更新:这是我目前的解决方案,但我认为一定有更聪明的方法:

@my_content = ""
@selected_node = true

def collect_content(_start)

if _start == @end_element
@my_content << _start.to_html
@selected_node = false
end

if @selected_node == true
@my_content << _start.to_html
collect_content(_start.next)
end

end

collect_content(@start_element)

puts @my_content

最佳答案

一个使用递归的太聪明的单行代码:

def collect_between(first, last)
first == last ? [first] : [first, *collect_between(first.next, last)]
end

迭代解决方案:

def collect_between(first, last)
result = [first]
until first == last
first = first.next
result << first
end
result
end

编辑:星号的(简短)解释

它称为 splat 运算符。它“展开”一个数组:

array = [3, 2, 1]
[4, array] # => [4, [3, 2, 1]]
[4, *array] # => [4, 3, 2, 1]

some_method(array) # => some_method([3, 2, 1])
some_method(*array) # => some_method(3, 2, 1)

def other_method(*array); array; end
other_method(1, 2, 3) # => [1, 2, 3]

关于ruby-on-rails - Nokogiri:选择元素 A 和 B 之间的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/820066/

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