假设我从body元素内的所有内容开始:
Nokogiri::HTML( doc ).xpath( "/html/body/node()" ).to_html
,其中包含一些<script>
和<noscript>
。我怎么去掉这些?
您可能希望将XPath表达式更改为:
Nokogiri::HTML( doc ).xpath( "/html/body/node()[not(self::script or self::noscript)]" ).to_html
#!/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>
标记之间的间隙是在实际目标标记后面的文本节点中回车的结果。