2010-04-22 2 views
13

У меня есть HTML-документ со ссылками ссылок, для Exemple:Изменение HREF атрибутов с nokogiri и рубин на рельсах

<html> 
    <body> 
    <ul> 
    <li><a href="http://someurl.com/etc/etc">teste1</a></li> 
    <li><a href="http://someurl.com/etc/etc">teste2</a></li> 
    <li><a href="http://someurl.com/etc/etc">teste3</a></li> 
    <ul> 
    </body> 
</html> 

Я хочу с Ruby On Rails, с nokogiri или каким-либо другим способом, чтобы иметь окончательный документ например:

<html> 
    <body> 
    <ul> 
     <li><a href="http://myproxy.com/?url=http://someurl.com/etc/etc">teste1</a></li> 
     <li><a href="http://myproxy.com/?url=http://someurl.com/etc/etc">teste2</a></li> 
     <li><a href="http://myproxy.com/?url=http://someurl.com/etc/etc">teste3</a></li> 
    <ul> 
    </body> 
</html> 

Какая стратегия для достижения этой цели?

+0

Вы динамически строить страницу HTML в шаблоне рельсах (т.е. .html.erb) или он уже был построен, и вы хотите, чтобы повторно -сканировать его (используя Nokogiri и т. д.) после факта? –

+0

Документ уже построен. –

ответ

25

Если вы решили использовать Nokogiri, я думаю, что это должно работать:

require 'cgi' 
require 'rubygems' rescue nil 
require 'nokogiri' 

file_path = "your_page.html" 
doc = Nokogiri::HTML(open(file_path)) 
doc.css("a").each do |link| 
    link.attributes["href"].value = "http://myproxy.com/?url=#{CGI.escape link.attributes["href"].value}" 
end 
doc.write_to(open(file_path, 'w')) 

Если я не ошибаюсь рельсы нагрузки REXML вверх по умолчанию, в зависимости от того, что вы пытаетесь сделать, вы могли бы использовать это также.

+0

Работает как очарование! Благодарю jdeseno! –

+2

'link ['href']' является ярлыком для 'link.attributes [" href "]. Value' – aidan

+0

Что делать, если я хочу вывести измененную переменную? – nXqd

0

Вот что я сделал для замены изображения SRC атрибуты:

 doc = Nokogiri::HTML(html) 
     doc.xpath("//img").each do |img| 
     img.attributes["src"].value = Absolute_asset_path(img.attributes["src"].value) 
     end 
     doc.to_html     // simply use .to_html to re-convert to html 
Смежные вопросы