这与我昨天发布的something类似,但我与我面前的实际情况混淆了。我有两个数组需要合并到相同的索引值但我有capybara elements
而不是字符串和整数。
实施例
@returned_names = page.all('#results > table.result > tbody > tr.data:first-of-type > td')
@returned_yobs = page.all('#results > table.result > tbody > tr.data:nth-child(2) > td')
# Returns
@returned_names = [#<Capybara::Element tag="td">, #<Capybara::Element tag="td">, #<Capybara::Element tag="td">]
@returned_yobs = [#<Capybara::Element tag="td">, #<Capybara::Element tag="td">, #<Capybara::Element tag="td">]
所以根据昨天的答案将这些合并在一起,我应该做的匹配索引值
@collection = @returned_names.zip(@returned_yobs).map { |r| r.join(' ') }
# Returns
["#<Capybara::Node::Element:0x000000038c50e8> #<Capybara::Node::Element:0x000000036fadf8>",
"#<Capybara::Node::Element:0x000000038c50c0> #<Capybara::Node::Element:0x000000036fadd0>",
"#<Capybara::Node::Element:0x000000038c5020> #<Capybara::Node::Element:0x000000036fada8>"]
到目前为止,它看起来正在做正确的事情。我需要将其转换为其文本值的数组,但是当我这样做时
@collection.map { |t| t.text }
我收到错误
undefined method `text' for #<String:0x00000001938310>
我猜我不能从这里映射,因为我现阶段没有可枚举的对象?
有没有办法让@collection
回到可枚举的对象,以便我可以映射文本值?
答案 0 :(得分:1)
Array#join
将每个对象(即节点)转换为字符串。这应该有效:
@returned_names.zip(@returned_yobs).map { |name, yob| "#{name.text} #{yob.text}" }
答案 1 :(得分:0)
怎么样:
@collection.each { |capybara_element| }.map(&:text)
或更详细但会做同样的事情:
@text_collection = []
@collection.each do |element|
@text_collection.push(element.text)
end