2010-04-22 26 views
13

I Have a tài liệu HTML với các liên kết liên kết, cho dụ:Thay đổi thuộc tính href với nokogiri và 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> 

Tôi muốn với Ruby on Rails, với nokogiri hoặc một số phương pháp khác, để có một doc thức như thế này:

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

Chiến lược tốt nhất để đạt được điều này là gì?

+0

Bạn có động xây dựng các trang html trong một mẫu lan can (tức là .html.erb) hay là nó đã được xây dựng và bạn muốn tái -can nó (sử dụng Nokogiri vv) sau khi thực tế? –

+0

Tài liệu đã được tạo. –

Trả lời

25

Nếu bạn chọn sử dụng Nokogiri, tôi nghĩ rằng điều này sẽ làm việc:

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

Nếu tôi không nhầm đường ray tải REXML lên theo mặc định, tùy thuộc vào những gì bạn đang cố gắng làm bạn có thể sử dụng này cũng thế.

+0

Hoạt động như một sự quyến rũ! Cảm ơn jdeseno! –

+2

'link ['href']' là một phím tắt cho 'link.attributes [" href "]. Value' – aidan

+0

nếu tôi muốn xuất kết quả đã thay đổi thành một biến thì sao? – nXqd

0

Dưới đây là những gì tôi đã làm cho việc thay thế hình ảnh src thuộc tính:

 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