ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Ruby nokogiri укажите на ошибку
  #1  
Старый 12.06.2009, 14:16
Аватар для roddik
roddik
Познающий
Регистрация: 14.01.2009
Сообщений: 93
Провел на форуме:
244235

Репутация: 39
По умолчанию Ruby nokogiri укажите на ошибку

Привет. Я нуб в руби, но вот пытаюсь освоить mechanize, код внизу
Код:
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
выводит
Код:
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  
Старый 12.06.2009, 16:15
Аватар для astrologer
astrologer
Постоянный
Регистрация: 30.08.2007
Сообщений: 773
Провел на форуме:
3069349

Репутация: 808


По умолчанию

Логично предположить, что результатом выборки xpath является статичный массив и изменения в dom на него не влияют.

Цитата:
по идее скрипт должен печатать три раза первый нод, ведь я делаю replace второго нода на первый
А по-моему, по такой идее должен быть бесконечный цикл
 
Ответить с цитированием

  #3  
Старый 12.06.2009, 16:24
Аватар для roddik
roddik
Познающий
Регистрация: 14.01.2009
Сообщений: 93
Провел на форуме:
244235

Репутация: 39
По умолчанию

В общем-то xpath возвращает не массив с копиями нодов, а ссылки на них, насколько я знаю, поэтому, скажем, такой код работает

Код:
form.form_node.xpath(%q"//textarea").each do |input|
    input.name = 'p'
  end

  line = form.form_node.to_s
в том смысле, что в line нету textarea
 
Ответить с цитированием

  #4  
Старый 12.06.2009, 16:40
Аватар для astrologer
astrologer
Постоянный
Регистрация: 30.08.2007
Сообщений: 773
Провел на форуме:
3069349

Репутация: 808


По умолчанию

Цитата:
Сообщение от roddik  
В общем-то xpath возвращает не массив с копиями нодов, а ссылки на них
Никто и не говорит про копии. Просто после выборки эта коллекция уже не меняется и input.replace на нее также не влияет, а изменяет только исходное дерево элементов. Это легко проверить, может, я и не прав
 
Ответить с цитированием

  #5  
Старый 12.06.2009, 16:52
Аватар для roddik
roddik
Познающий
Регистрация: 14.01.2009
Сообщений: 93
Провел на форуме:
244235

Репутация: 39
По умолчанию

Код:
form.form_node.xpath(%q"//input").each do |input|
    input.replace(Nokogiri::XML::Text.new('helo', form.form_node))
end
Код:
[BUG] Segmentation fault
ruby 1.8.6 (2008-08-11) [i386-mswin32]
wtf
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по Ruby on Rails ! 043nKRuT0y PHP, PERL, MySQL, JavaScript 13 15.04.2009 20:35
Переполнение памяти в Ruby Talisman Мировые новости 3 07.11.2006 06:50



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ