Ruby nokogiri укажите на ошибку

Discussion in 'PHP' started by roddik, 12 Jun 2009.

  1. roddik

    roddik Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    13
    Reputations:
    0
    Привет. Я нуб в руби, но вот пытаюсь освоить 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 второго нода на первый. В чем ошибка? Спасибо
     
  2. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Логично предположить, что результатом выборки xpath является статичный массив и изменения в dom на него не влияют.

    А по-моему, по такой идее должен быть бесконечный цикл
     
  3. roddik

    roddik Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    13
    Reputations:
    0
    В общем-то xpath возвращает не массив с копиями нодов, а ссылки на них, насколько я знаю, поэтому, скажем, такой код работает

    Code:
    form.form_node.xpath(%q"//textarea").each do |input|
        input.name = 'p'
      end
    
      line = form.form_node.to_s
    в том смысле, что в line нету textarea
     
  4. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Никто и не говорит про копии. Просто после выборки эта коллекция уже не меняется и [font=Consolas,Courier new,monospace]input.replace[/font] на нее также не влияет, а изменяет только исходное дерево элементов. Это легко проверить, может, я и не прав :)
     
  5. roddik

    roddik Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    13
    Reputations:
    0
    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 :confused: