查看完整版本: HMTL TO TXT

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

wosmvp 2008-5-16 16:42

提取什么txt啊,没看懂……
提取源文件?
页: [1]
查看完整版本: HMTL TO TXT