すまん、専ブラだから空白消えるの忘れてた。
これで化けないと思うが、gbkでもutf-8でも解釈できる文字しかない部分があったら面倒だな。

import sys, re, urllib
# 適当
line_re = re.compile(r'^([\d.]+) - - \[(.*?)\] "(\w+) (.*?) (.+?)" (.+?) (.+?) "(.*?)" "(.*?)"$')
def convert(i, linein):
  try:
    record = list(line_re.match(linein.strip()).groups())
  except AttributeError:
    print "parse failed at line", i + 1
    sys.exit(1)
  url = record.pop(3).replace("/", "\n\n")

  def decode(x):
    bin = urllib.unquote(x)
    try:
      return unicode(bin, "utf-8")
    except UnicodeDecodeError:
      return unicode(bin, "gbk")

  record += decode(url).split(u"\n\n")
  out = u",".join([x.rstrip() for x in record]) + u"\n"
  return out.encode("utf-8")

converted = (convert(i, x) for i, x in enumerate(file("112115.txt", "r")))
f = file("112115.csv.html", "w")
f.write("<pre lang='zh'>")
f.writelines(converted)
f.write("</pre>")