是乎开始准备搬家的工作….

   上次用python写了一点从CU上导出文章的脚本, 不过有些问题, 当时又因为blogspot又被封了, 所以就停下来没写. 昨天晚上来了兴致,

便又继续写了起来.

   首先是用脚本取得CU上的网页的问题,

在用firefox打开我的blog的时候实际上得到的是一个xml格式的文档, xml的一个好处就是好解析啊. 可是在代码里用urllib.urlopen(…)的时候得到的却是一个html的文本, 很是奇怪,

最后想到一种可能就是使用urllib获取网页的时候实际上少了用浏览器发送http请求时的头信息, 于是google一下python里的库, 有一个httplib, 可以发送请求.

它的大致使用是:

conn =

httplib.HTTPConnection(“blog.chinaunix.net:80″)
    conn.request(“GET”,

url,”", headers)
    response = conn.getresponse ()

    其中的headers就是你所要发送的http头的map.
    但是我在用python的交互式环境调试的时候,

第二行总是通不过, 说是无法请求, 后来直接写在代码里却又没有问题,

然后自己恍然大悟, httpconnection 是在第一行的时候打开的, 交互的时候, 人的反应时间很慢,

当你再次发送response的时候, 原来那个connection已经被关掉了…. Orz…
    知道需要在请求的时候发送http, 可是如何知道firefox在请求的时候会发送什么样的头呢?

这个只要google一下”browser http header”, 就能找到相关的网页列出你的浏览器发送的头信息了(其实这个的实现代码也没有几行, 不过又何必再发明轮子~~),

我看到的自己的http 头是这样的:

Name                  Value

connection            keep-alive
accept-language       zh-cn,en;q=0.5
content-length        0
host                  www.ericgiguere.com
accept-encoding       gzip,deflate
accept               text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

accept-charset       GB2312,utf-8;q=0.7,*;q=0.7
keep-alive            300
user-agent           Mozilla/5.0 (X11; U; Linux i686;

en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3

 

   这里我选取了几个有用的user-agent,

accept, accept-language, 我们这里会看到在accept里会有列出可接受的内容格式, 估计CU的服务器会检测你header里的这个字段,

如果发现没有text/xml会直接返回给你html的内容,

这里我把accept-encoding头去掉了, 因为我可不想服务器给我发过来gzip压缩的内容 :) , 我的header定义成下面的样子

headers = {
            “User-Agent”:   “Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3″,
            “Accept-Language”:      “en-us,en;q=0.5″,
            “Accept”: “text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5″
            }

   至于解析xml选择的是用minidom这个包, 感觉比sax要简单些, 虽然内存消耗会大点, 但我的这点文章也占不了多少内存J

   另外还有一个问题就是CU blog的编码方式是采用的gb2312编码, minidom对于此类编码支持不好,

在网上找了个解决方法就是先把文件编码转换成utf-8, 下面是相关代码:

x = re.match(‘<\?xml(\s|version.{4,})+encoding=”(\w*)”.*’, texts)

    if x:
        ec = x.group

(2)
        texts =

re.sub(x.group(2), ‘utf-8′, texts)
        strIO =

StringIO.StringIO(unicode(texts, ec).encode(‘utf-8′))
    else:
        strIO =

StringIO.StringIO(texts)

  再另外的东西就没啥内容了, 无非是对相关内容的处理,

然后把内容写进自己的文件 :) , 另外对于图片和文件还没有处理. (昨天为了调这个程序让我的blog的访问里飙升了好几百啊, haha~~)

     这些就基本是我的blog备份工具的重要部分, 至于源代码就不在这贴了, 不然有人会不高兴的:)

    可是怎么能把这些文章再导入到blogspot里呢? 自己想的一个方法是写个脚本采用邮件发布的方式弄过去, 不过估计效果不是太好,