Привет. Я нуб в руби, но вот пытаюсь освоить mechanize, код внизу Code: require 'rubygems' require 'mechanize' a = WWW::Mechanize.new { |agent| agent.user_agent_alias = 'Mac Safari' } a.get('http://www.usj.com.my/gallery/add_comment.php?set_albumName=album49&id=I&gallery_popup=true') do |page| form = page.forms.first node = form.form_node thisinp = nil node.xpath(%q"//input[not(@type) or @type!='hidden']").each do |input| next unless input[:name] if thisinp.nil? thisinp = input else puts 'replacing' input.replace(thisinp) end puts input.class puts input end puts thisinp end выводит Code: Nokogiri::XML::Element <input name="commenter_name" value="" size="30"> replacing Nokogiri::XML::Element <input name="save" type="submit" value="Post comment"> <input name="commenter_name" value="" size="30"> . Я ожидал бы увидеть на месте второго инпута первый, то есть вообще по идее скрипт должен печатать три раза первый нод, ведь я делаю replace второго нода на первый. В чем ошибка? Спасибо
Логично предположить, что результатом выборки xpath является статичный массив и изменения в dom на него не влияют. А по-моему, по такой идее должен быть бесконечный цикл
В общем-то xpath возвращает не массив с копиями нодов, а ссылки на них, насколько я знаю, поэтому, скажем, такой код работает Code: form.form_node.xpath(%q"//textarea").each do |input| input.name = 'p' end line = form.form_node.to_s в том смысле, что в line нету textarea
Никто и не говорит про копии. Просто после выборки эта коллекция уже не меняется и [font=Consolas,Courier new,monospace]input.replace[/font] на нее также не влияет, а изменяет только исходное дерево элементов. Это легко проверить, может, я и не прав
Code: form.form_node.xpath(%q"//input").each do |input| input.replace(Nokogiri::XML::Text.new('helo', form.form_node)) end Code: [BUG] Segmentation fault ruby 1.8.6 (2008-08-11) [i386-mswin32] wtf