aihua 2008-5-16 13:41
HMTL TO TXT
第一次发贴。 如果不周,请多包涵。
因有工作需要,从海量html中提取txt,作为测试数据,上网查询程序未果,只好自己写了一个程序。
特点:
1.可以支持海量html的txt的提取。基本上网路上的软件,就是死在这里。
2.提取的文件统一转成单一编码格式。有些htmlutf8,有些不是。。
3.支持多文件夹。
4.忽略所有错误,勇往直前。
5.提取率不太高。
6.运行速度也比较慢。
代码如下:[code]##################################
#
# 从HTML中提取有效数据
#
##################################
require 'hpricot'
require 'pp'
require 'find'
require 'iconv'
require 'yaml'
class String
def utf8?
unpack('U*') rescue return false
true
end
def ascii?
self.split(/./).all?{|ch| ch < 128}
end
end
#读取有效数据,写入输入文件
def delhtml str
html =["<",">","=","td","form","input","/","br","colspan","align","div","id","h3","h1","h2","IMG","target","type",".""script",":",";","var","\""]
html.each do |key|
str.delete!(key)
end
str
end
#读取有效数据,写入输入文件
def analysis2 doc
search_key = ['a','p','li','td','div','strong','th','h1','h2','h3','h4']
a = []
search_key.each do |key|
doc.search(key).each do |p|
txt = p.inner_text.gsub(/[\s]+/,"")
if txt.size > 0 then
a << txt
end
end
end
return a.to_s
end
#进行单个页面解析
def single_web input_file_name,out_file_name
# 记录分析到了那个文件
#File.exists? file_log
error_num = 0
#遍历所有的文件
begin
out_text = ""
#puts "input_file #{input_file_name}"
open(input_file_name,'r') do |f|
out_text = analysis2 Hpricot(f)
#out_text = delhtml f.read
end
#check 文件格式 如果是utf8,则转码
if out_text.utf8? then
converter = Iconv.new('shift-jis//IGNORE', 'utf-8')
out_text = converter.iconv(out_text)
end
if out_text.size > 0 then
# 记录下来当前的文件信息
#puts "out_file_name > #{out_file_name}"
open(out_file_name,'w'){ |f|
f << out_text
}
puts "out file #{out_file_name}"
end
rescue Hpricot::ParseError
p "error:#{$!} ","at:#{$@}"
rescue
p "error:#{$!} ","at:#{$@}"
end
end
#遍历所有文件
def findFile src_path
out_file_name = 0
filelist = []
Find.find(src_path){ |path|
case path
when './'
# puts "是当前目录"
else
if File.directory?path then
# puts "是子目录"
end
if File.file?path
# puts "是文件"
# filelist << path
out_file_name = out_file_name +1
single_web path,out_file_name.to_s + ".txt"
if ( out_file_name % 100 == 0 ) then
puts "file index -> #{out_file_name}"
end
end
end
}
puts "file list size " + filelist.size.to_s
return filelist
end
problem = YAML.load(File.open("config.yaml"))
src_path = problem["html"]["src_path"]
paths = src_path.split(";")
paths.each { |path|
puts path
findFile path
}
puts "error num :#{$error_num}"
puts 'ok'
#findFile2[/code]
[[i] 本帖最后由 aihua 于 2008-5-16 13:44 编辑 [/i]]
aihua 2008-5-16 13:45
为什么 .to 方法显示都是 .<SPAN class=t_tag onclick=tagshow(event) href="tag.php?name=to_s">to_s