打印

[一般问题] 【已解决】又有新的问题 涉及到编码转换上

【已解决】又有新的问题 涉及到编码转换上

问题已经解决了,因为我只过滤了单引号,没有过滤双引号造成的。

我把代码发出来吧 这段代码应用了很多东西
比如 HTTP通信 XML解析 UTF-8和GBK的编码转换 数据库的连接和操作 错误的捕获和处理等等

require 'win32ole' #win32ole库
require 'dbi' #数据库
require 'rexml/document'#xm库
require 'iconv'#字符集转换

include REXML

# utf8 to gbk
def u2g(ucode)
  begin
    "#{Iconv.conv('gb2312','utf-8',ucode)}"
  rescue
     " #{ucode} " #如果转换不成功 则不转换 并在字串两边加入空格 避免构造出错误的sql字符串
  end
end


site = 'shooter.cn' #采集的目标网站
req = Net::HTTP.new(site,80) #创建请求对象

start_id = 1 #起始id
end_id = 9000 #结束id

#数据库执行句柄 db handler
dbh=DBI.connect("DBI:ADO:Provider=SQLOLEDB.1;Data Source=192.168.0.10;Initial Catalog=shooter;User Id=sa;Password=asdf*123;") 

start_id.upto(end_id){|idx|
  begin
    resp, body = req.get("/static/sub/detail/#{idx}.xml")  #获取页面内容
  rescue
    puts "retry #{idx}"
    redo  #出现访问url超时的错误 重试
  end
  
  begin
    fileInfo = Hash.new #创建文件信息

    xmldoc = Document.new body #载入xml文档
    xmldoc.root.each_element{|ele|  #解析每一个xml元素
      case ele.name  #判断该元素的名称
      when 'id','fileid','imdbid','splito','rlsiteid','voteid','threadid','deleted','moderid'
        fileInfo[ele.name] = u2g(ele.text).delete "'"""  #该元素内有一个text node 设置为该key的value
      else
        fileInfo[ele.name] = u2g(ele.cdatas[0].value).delete "'"""  #该元素内有一个 CData 设置为该key的value
      end
    }
  rescue
    next #出现xml没办法解析的错误 直接跳过
  end
  
  begin
  strsql = "insert into tb_files (fileid,orgname,engname,akaname,chname,twname,hkname,othname,intro,format,[language],splito,producer,verifier,source,delreason)
     values ('#{fileInfo['fileid']}','#{fileInfo['orgname']}','#{fileInfo['engname']}','#{fileInfo['akaname']}','#{fileInfo['chname']}','#{fileInfo['twname']}','#{fileInfo['hkname']}',
    '#{fileInfo['othname']}','#{fileInfo['intro']}','#{fileInfo['format']}','#{fileInfo['language']}','#{fileInfo['splito']}','#{fileInfo['producer']}','#{fileInfo['verifier']}','#{fileInfo['source']}','#{fileInfo['delreason']}')"
    dbh.do strsql #加一个任务
    rows = dbh.commit #提交任务
    if rows == 0 then
      puts "插入失败:#{fileInfo['fileid']} #{fileInfo["orgname"]}"
    else
      puts "插入成功:#{fileInfo['fileid']} #{fileInfo["orgname"]}"
    end
  rescue
    puts strsql #出现数据插入错误 打印sql字符串
  end
}
dbh.disconnect #关闭连接


大家想测试抓取的话 可以把sql部分代码注释掉 把结果写入一个文件里

[ 本帖最后由 rubylee 于 2008-4-15 16:14 编辑 ]
埋头做事 低头做人

TOP

HTTP的get肯定没问题
REXML的解析也没出问题

问题可能出在 Iconv的转换和数据库DBI模块上
埋头做事 低头做人

TOP

几乎可以肯定是在字符集转换上的问题。
能不能先做一个测试,因为你的问题起因是由于XML文件是UTF8的,那么先把XML文件改成你能用的字符集来试一下。
好像记得数据库端也有字符集的说法。
不知道Ruby这里能不能用预定义SQL,我是不怎么赞成字符串拼接SQL的方式的。

不是很懂,不是很熟,只能给出这么点建议了。
本帖最近评分记录
  • rubylee R币 +3 感谢 2008-4-15 14:47

TOP

def u2g(ucode)
  " #{Iconv.conv('gb2312','utf-8',ucode)} " 
end 

看我的u2g函数 我可以在返回值的前后都家了一个空格 因为我害怕有显示不出来的特殊字符 在插入到数据库的时候 会拼接成一个非法的insert语句

这样可以避免一些问题 出问题的几率小了 但还是存在 我很头疼。。
埋头做事 低头做人

TOP

PHP在这方面的资料不更多么,为什么会用RUBY来实现采集功能呢?

TOP

没学过php 不知道php可以本机解释执行吗

印象中php只能在apache或iis等web服务器中被当作一种解释引擎
埋头做事 低头做人

TOP

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