2015-01-03 2 views
1

У меня этот код:GSUB на месте не работает

Firm.all.each do |firm| 
    url = firm.site 
    doc = Nokogiri::HTML(open(url)) 
    data = doc.css("##{firm.menu_id} a") 
    data.each do |e| 
     e.text.strip! 
     e.text.gsub!(/[\n\t]*/,'') 
     puts e.text 
    end 
end 

Строки показываются в том же формате, что и ввод (это означает, метод gsub! не влияет на строку). Я думаю, что e.text может быть неизменным, но я хотел бы это сделать.

+0

Что делать, если вас поместите этот e.text в строковую переменную, а затем gsub! Это? – lcguida

+0

Если 'e.text' был« заморожен »(например,' immutable'), то был бы поднят 'RuntimeError'. – ptierno

+0

@rockskull Я пробовал, что вы говорите, и это работает. Я изменил строки для 'text = e.text.strip' и' text.gsub! (/ [\ N \ t] * /, '') 'и это сработало. Но с 'e.text' методы на месте не работают. BTW, RuntimeError не отображается, поэтому, учитывая, что @PeteyT говорит, что 'e.text' является изменяемым. – cizambra

ответ

1

text метод возвращает новую строку каждый раз, который можно увидеть с помощью object_id:

e = Nokogiri::XML('<a>text</a>') 

e.text.object_id == e.text.object_id # => false 

Если вы хотите изменить текст этого узла, установите содержание:

e.at_css('a').content = "foo" 
e.text # => "foo" 
+0

Большое спасибо, это тот ответ, который мне нужен! – cizambra

+0

@cizambra, почему бы вам не отменить ответ, если вы сочли его полезным? –

+0

Я пробовал, но мне кажется, что у меня недостаточно репутации, чтобы сделать это (Vote Up требует 15 репутации). – cizambra