打印

HMTL TO TXT

HMTL TO TXT

第一次发贴。 如果不周,请多包涵。
 因有工作需要,从海量html中提取txt,作为测试数据,上网查询程序未果,只好自己写了一个程序。
 特点:
 1.可以支持海量html的txt的提取。基本上网路上的软件,就是死在这里。
 2.提取的文件统一转成单一编码格式。有些htmlutf8,有些不是。。
 3.支持多文件夹。
 4.忽略所有错误,勇往直前。
 5.提取率不太高。
 6.运行速度也比较慢。

 代码如下:

##################################
#
#   从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


[ 本帖最后由 aihua 于 2008-5-16 13:44 编辑 ]

TOP

为什么 .to 方法显示都是 .<SPAN class=t_tag onclick=tagshow(event) href="tag.php?name=to_s">to_s

TOP

提取什么txt啊,没看懂……
提取源文件?

TOP

2008-11-22 19:13 Crawled by CCBot/1.0 (+http://www.commoncrawl.org/bot.html) @38.103.63.61