2011-09-12 72 views
1

說我先從body元素中的一切:如何在Ruby on Rails中使用Nokogiri中的XPath忽略HTML腳本元素?

Nokogiri::HTML(doc).xpath("/html/body/node()").to_html 

其中包含了一些<script><noscript>。我如何擺脫這些?

+0

您是否試圖淨化/淨化您的HTML? –

+0

我對HTML的回答不夠全面,但我試圖將一些命令行XSLT命令重寫爲Nokogiri,因爲Heroku不支持命令行工具。 – Eric

回答

2

您可能需要您的XPath表達式更改爲:

Nokogiri::HTML(doc).xpath("/html/body/node()[not(self::script or self::noscript)]").to_html 
1
#!/usr/bin/env ruby 

require 'nokogiri' 

html = <<EOT 
<html> 
    <head> 
    <script> 
     <!-- dummy script !> 
    </script> 
    </head> 
    <body> 
    <script><!-- dummy script !></script> 
    <noscript>dummy script</noscript> 
    </body> 
</head> 
EOT 

doc = Nokogiri::HTML(html) 

下面是它的要點:

doc.at('body').search('script,noscript').remove 

puts doc.to_xml 

>> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
>> <html> 
>> <head> 
>> <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> 
>> <script> 
>>  <!-- dummy script !> 
>>  </script> 
>> </head> 
>> <body> 
>>  
>> </body> 
>> </html> 

爲簡單起見,我使用的引入nokogiri的使用CSS存取能力而不是XPath。

doc.at('body').search('script,noscript').remove 

將查找<body>標籤的第一次出現,然後查找裏面的所有<script><noscript>標記,刪除它們。

由此產生的<body>標記之間的差距是文本節點中跟蹤實際目標標記的回車的結果。

+0

謝謝,這個答案也適用於我。 – Eric

相關問題