2011-10-24 25 views
8

Tôi có một số mã sử dụng Nokogiri và tôi đang cố gắng lấy số inner_html mà không nhận được nhận xét.Xóa nhận xét từ inner_html

html = Nokogiri::HTML(open(@sql_scripts_url[1])) #using first value of the array 
html.css('td[class="ms-formbody"]').each do |node| 
    puts node.inner_html # prints comments 
end 
+2

Vui lòng cung cấp đoạn mã HTML mẫu và chuỗi kết quả bạn muốn sau khi xoa bóp. – Phrogz

+0

tôi chỉ cần xóa các nhận xét HTML như "" từ html của tôi. Tôi đã sử dụng dải và nó hoạt động. Tôi không biết nếu điều này là đúng cách mặc dù. – Maverick

Trả lời

12

Vì bạn chưa cung cấp bất kỳ HTML mẫu hoặc đầu ra mong muốn, đây là một giải pháp chung:

Bạn có thể chọn comments SGML trong XPath bằng thử nghiệm comment() nút; bạn có thể tách chúng ra khỏi tài liệu bằng cách gọi .remove trên tất cả các nút nhận xét. Minh họa:

require 'nokogiri' 
doc = Nokogiri.XML('<r><b>hello</b> <!-- foo --> world</r>') 
p doc.inner_html      #=> "<b>hello</b> <!-- foo --> world" 
doc.xpath('//comment()').remove 
p doc.inner_html      #=> "<b>hello</b> world" 

Lưu ý rằng sẽ thay đổi trên tài liệu triệt tiêu để loại bỏ các ý kiến. Nếu bạn muốn giữ lại các tài liệu gốc chưa sửa đổi, bạn có cách khác có thể làm điều này:

class Nokogiri::XML::Node 
    def inner_html_reject(xpath='.//comment()') 
    dup.tap{ |shadow| shadow.xpath(xpath).remove }.inner_html 
    end 
end 

doc = Nokogiri.XML('<r><b>hello</b> <!-- foo --> world</r>') 
p doc.inner_html_reject #=> "<r><b>hello</b> world</r>" 
p doc.inner_html  #=> "<r><b>hello</b> <!-- foo --> world</r>" 

Cuối cùng, lưu ý rằng nếu bạn không cần phải đánh dấu, chỉ hỏi cho text bản thân không bao gồm ý kiến ​​HTML:

p doc.text    #=> "hello world" 
+0

Tôi sẽ cố gắng sử dụng cách tiếp cận đầu tiên để phân tích cú pháp các tệp cấu hình .net và thay thế các giá trị với các giá trị môi trường triển khai cụ thể và triển khai các tệp đó. – Maverick

+4

Thậm chí ngắn hơn là 'doc.xpath ('// comment()'). Remove' loại bỏ tất cả nhận xét cùng một lúc. Không cần liệt kê chúng. – akuhn

+1

@akuhn Tuyệt vời! Trước đây tôi chưa từng thấy ['Nokogiri :: XML :: NodeSet # remove'] (http://nokogiri.org/Nokogiri/XML/NodeSet.html#method-i-remove). Cảm ơn bạn. Tôi đã cập nhật câu trả lời của tôi cho phù hợp (và sẽ phải đi và cập nhật các câu trả lời khác xung quanh trang web;). – Phrogz