有很多的如何从使用Ruby,以及角度来说,Hpricot一个引入nokogiri文件剥离HTML标记示例具有方便,快捷地清除所有HTML你inner_text方法。
我所试图做的是相反的,从HTML文档中删除所有文字,只留下标记及其属性。
我考虑循环通过文档inner_html设置为nil,但当时真的是你不得不做反向作为第一个元素(根)具有文档的整个其余的inner_html,所以最好我不得不在开始最内元件和inner_html设置为nil,同时通过祖先向上移动。
有谁知道有效地做这一个整洁的小把戏? 我在想也许正则表达式的可能做到这一点,但可能不能有效作为HTML标记生成器/解析器可能。
这工作太:
doc = Nokogiri::HTML(your_html)
doc.xpath("//text()").remove
您可以扫描字符串创建“标记”的数组,然后只选择那些HTML标签:
>> some_html
=> "<div>foo bar</div><p>I like <em>this</em> stuff <a href='http://foo.bar'> long time</a></p>"
>> some_html.scan(/<\/?[^>]+>|[\w\|`~!@#\$%^&*\(\)\-_\+=\[\]{}:;'",\.\/?]+|\s+/).select { |t| t =~ /<\/?[^>]+>/ }.join("")
=> "<div></div><p><em></em><a href='http://foo.bar'></a></p>"
== ==编辑
甚至更好,只扫描HTML标签;)
>> some_html.scan(/<\/?[^>]+>/).join("")
=> "<div></div><p><em></em><a href='http://foo.bar'></a></p>"
为了不抢在标签的一切,你可以使用引入nokogiri这样的:
doc.search('//text()').text
当然,这会抢东西一样的内容<script>
或<style>
标签,所以你也可以删除黑名单标签:
blacklist = ['title', 'script', 'style']
nodelist = doc.search('//text()')
blacklist.each do |tag|
nodelist -= doc.search('//' + tag + '/text()')
end
nodelist.text
你也可以加入白名单,如果你首选,但是这可能会是更多的时间密集型:
whitelist = ['p', 'span', 'strong', 'i', 'b'] #The list goes on and on...
nodelist = Nokogiri::XML::NodeSet.new(doc)
whitelist.each do |tag|
nodelist += doc.search('//' + tag + '/text()')
end
nodelist.text
你也可以只建立一个庞大的XPath表达式,做一个搜索。 老实说,我不知道哪条路是更快,或者甚至有一个明显的区别。
我只是想出了这一点,但@安德烈-R的解决方案是洙好得多!
#!/usr/bin/env ruby
require 'nokogiri'
def strip_text doc
Nokogiri(doc).tap { |doc|
doc.traverse do |node|
node.content = nil if node.text?
end
}.to_s
end
require 'test/unit'
require 'yaml'
class TestHTMLStripping < Test::Unit::TestCase
def test_that_all_text_gets_strippped_from_the_document
dirty, clean = YAML.load DATA
assert_equal clean, strip_text(dirty)
end
end
__END__
---
- |
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
<meta http-equiv='Content-type' content='text/html; charset=UTF-8' />
<title>Test HTML Document</title>
<meta http-equiv='content-language' content='en' />
</head>
<body>
<h1>Test <abbr title='Hypertext Markup Language'>HTML</abbr> Document</h1>
<div class='main'>
<p>
<strong>Test</strong> <abbr title='Hypertext Markup Language'>HTML</abbr> <em>Document</em>
</p>
</div>
</body>
</html>
- |
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<meta http-equiv="content-language" content="en">
</head>
<body><h1><abbr title="Hypertext Markup Language"></abbr></h1><div class="main"><p><strong></strong><abbr title="Hypertext Markup Language"></abbr><em></em></p></div></body>
</html>