2010-04-22 14 views
13

J'ai un document HTML avec des liens de liens, pour exemple:Modification d'attributs href avec nokogiri et rubis sur des 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> 

Je veux avec Ruby on Rails, avec nokogiri ou une autre méthode, pour avoir une doc finale comme ceci:

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

Quelle est la meilleure stratégie pour y parvenir?

+0

Êtes-vous construire dynamiquement la page html dans un modèle de rails (c.-à-.html.erb) ou a déjà été construit et que vous voulez à nouveau -scan (en utilisant Nokogiri etc) après le fait? –

+0

Le document est déjà construit. –

Répondre

25

Si vous choisissez d'utiliser Nokogiri, je pense que cela devrait fonctionner:

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

Si je suis rails ne me trompe pas les charges REXML par défaut, en fonction de ce que vous essayez de faire, vous pouvez utiliser aussi.

+0

Fonctionne comme un charme! Merci jdeseno! –

+2

'link ['href']' est un raccourci pour 'link.attributes [" href "]. Value' – aidan

+0

que se passe-t-il si je veux afficher la variable dans une variable? – nXqd

0

Voici ce que je l'ai fait pour remplacer les images src attributs:

 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