2010-04-22 11 views
13

Mam dokument HTML z linkami linkami, dla exemple:Zmiana atrybutów href z Nokogiri i Ruby on Rails

<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> 

Chcę z Ruby on Rails, z Nokogiri lub innej metody, aby uzyskać końcowe doc tak:

<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> 

Jaka jest najlepsza strategia, aby to osiągnąć?

+0

Czy jesteś dynamicznie budowania stronę HTML w szablonie szyn (tj .html.erb) lub został on już zbudowany i chcesz ponownie -scan to (używając Nokogiri itp) po fakcie? –

+0

Dokument jest już zbudowany. –

Odpowiedz

25

Jeśli zdecydujesz się skorzystać Nokogiri, myślę, że to powinno działać:

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')) 

Jeśli się nie mylę szyny ładunki REXML się domyślnie, w zależności od tego, co próbujesz zrobić można użyć tego również.

+0

Działa jak urok! Dziękuję jdeseno! –

+2

'link ['href']' jest skrótem do 'link.attributes [" href "]. Wartość' – aidan

+0

co jeśli chcę wyprowadzić zmieniony na zmienną? – nXqd

0

Oto co zrobiłem do wymiany zdjęć src atrybuty:

 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