2008年8月8日金曜日

wikipedia xml to Berkeley DB

I wanna get titles and link to wikipedia English pages from dump data of wikipedia.
This is the code.

  1. #/usr/bin/env python  
  2. # -*- coding: utf-8 -*-  
  3.   
  4. ### globals  
  5. import sys  
  6. import re  
  7. from bsddb import db  
  8. from xml.sax import ContentHandler  
  9. from xml.sax import make_parser  
  10.   
  11. class BaseHandler(ContentHandler):  
  12.       
  13.     def __init__(self, parser):  
  14.         ContentHandler.__init__(self)  
  15.         self.db = db.DB()  
  16.         self.db.open("test_db"None, db.DB_HASH, db.DB_CREATE)  
  17.   
  18.         self.parser = parser  
  19.         self.key_value_map = {}  
  20.           
  21.     def setHandlers(self, titleHandler, textHandler):  
  22.         self.titleHandler = titleHandler  
  23.         self.textHandler = textHandler  
  24.   
  25.     def startElement(self, name, attrs):  
  26.   
  27.         if name == u"title":  
  28.             self.parser.setContentHandler(self.titleHandler)  
  29.         elif name == u"text":  
  30.             self.parser.setContentHandler(self.textHandler)  
  31.   
  32.   
  33. class TitleHandler(ContentHandler):  
  34.     def __init__(self, baseHandler, parser):  
  35.         ContentHandler.__init__(self)  
  36.         self.baseHandler = baseHandler  
  37.         self.parser = parser  
  38.   
  39.   
  40.     def characters(self, char):  
  41.         if char:  
  42.             self.baseHandler.key_value_map["title"] = char.encode("utf-8")  
  43.   
  44.     def endElement(self, name):  
  45.         if name == u"title":  
  46.             #give handler  
  47.             self.parser.setContentHandler(self.baseHandler)  
  48.   
  49.   
  50. class TextHandler(ContentHandler):  
  51.       
  52.     def __init__(self, baseHandler, parser):  
  53.         ContentHandler.__init__(self)  
  54.         self.baseHandler = baseHandler  
  55.         self.parser = parser  
  56.   
  57.     def characters(self, char):  
  58.         r = re.compile(u"\[\[en:(.*?)\]\]")  
  59.         eng = r.findall(char)  
  60.         if eng:  
  61.             self.baseHandler.key_value_map["en"] = eng[0].encode("utf-8")  
  62.   
  63.     def endElement(self, name):  
  64.         if name == u"text":  
  65.             self.baseHandler.db.put(self.baseHandler.key_value_map["title"]  
  66.                                     , self.baseHandler.key_value_map.get("en", ""))  
  67.             print self.baseHandler.key_value_map  
  68.             self.parser.setContentHandler(self.baseHandler)  
  69.             #initialize the map  
  70.             self.baseHandler.key_value_map = {}  
  71.   
  72. if __name__ == "__main__":  
  73.     parser = make_parser()  
  74.     baseHandler = BaseHandler(parser)  
  75.     titleHandler = TitleHandler(baseHandler, parser)  
  76.     textHandler = TextHandler(baseHandler, parser)  
  77.     baseHandler.setHandlers(titleHandler, textHandler)  
  78.     xmlFile = open('jawiki-latest-pages-meta-current.xml''r')      
  79.     parser.setContentHandler(baseHandler)  
  80.     parser.parse(xmlFile)  
  81.   
  82.       

0 件のコメント: