All pastes #2080746 Raw Edit

wlcode

public text v1 · immutable
#2080746 ·published 2011-09-11 08:36 UTC
rendered paste body

#!/usr/bin/python

import lxml.html
import os
import sys
from pprint import pprint
import fnmatch

def locate(pattern, root=os.curdir, filesonly=True):
    for path, dirs, files in os.walk(os.path.abspath(root)):
        for filename in fnmatch.filter(files, pattern):
            yield os.path.join(path, filename)
        if not filesonly:
            for dd in dirs:
                yield os.path.join(path,dd)

#def main():
#  pprint(read_cable(sys.argv[1]))

def main():
   dir = sys.argv[1]
   i, limit = 0, 1000
   for f in locate("*.html", root=dir):
       pprint(readcable(f))
       i += 1
       if i > limit:
           break


def nom(lines, i):
  while lines[i] == '':
      i = i + 1
  return lines[i], i + 1

def readcable(f):
  # Read in HTML
  htm = open(f).read()
  idx = htm.find("Discussing cables")
  if idx < 0:
      raise "Invalid cable!"
  htm = htm[idx:]

  # Convert to TEXT
  t = lxml.html.fromstring(htm)

  # Do line-based processing from here.
  lines = t.text_content().encode('UTF8').split("\n")
  i = 5  # skip first 5 lines

  # Headers (check they're what we expected)
  junk, i = nom(lines, i); assert(junk == 'Reference ID');
  junk, i = nom(lines, i); assert(junk == 'Created');
  junk, i = nom(lines, i); assert(junk == 'Released');
  junk, i = nom(lines, i); assert(junk == 'Classification');
  junk, i = nom(lines, i); assert(junk == 'Origin');

  # Basic metadata just from line order
  cable = {}
  cable['refid'],          i = nom(lines, i);  
  cable['created'],        i = nom(lines, i); 
  cable['released'],       i = nom(lines, i); 
  cable['classification'], i = nom(lines, i); 
  cable['origin'],         i = nom(lines, i); 

  bodytext = lines[i:]


  # Rip TAGS: from body
  for line in bodytext:
    if line.startswith('TAGS:'):
      cable['tags'] = line.split(":", 1)[1].split()
      break

  # Rip SUBJECT: from body.  A little tricky; we're going
  # to look for a blank line to terminate.
  state = 0
  for line in bodytext:
    if state == 0:       # Look for "SUBJECT:"
      if line.startswith('SUBJECT:'): 
        cable['subject'] = line.split(":", 1)[1]
        state = 1
    elif state == 1:    # Collect until blank line
      if line.strip() == "":
        break            # Termination
      else:
        cable['subject'] += line

  cable['text'] = '\n'.join(bodytext)

  return cable 
  

if __name__ == '__main__':
  main()