I have a script that I had originally left as one long function.
#! /usr/bin/env python
import mechanize
from BeautifulSoup import BeautifulSoup
import sys
import sqlite3
def dictionary(word):
br = mechanize.Browser()
response = br.open('http://www.dictionary.reference.com')
br.select_form(nr=0)
br.form['q'] = word
br.submit()
definition = BeautifulSoup(br.response().read())
trans = definition.findAll('td',{'class':'td3n2'})
fin = [i.text for i in trans]
query = {}
word_count = 1
def_count = 1
for i in fin:
query[fin.index(i)] = i
con = sqlite3.connect('/home/oberon/vocab_database/vocab.db')
with con:
spot = con.cursor()
spot.execute("SELECT * FROM Words")
rows = spot.fetchall()
for row in rows:
word_count += 1
spot.execute("INSERT INTO Words VALUES(?,?)", (word_count,word))
spot.execute("SELECT * FROM Definitions")
rows = spot.fetchall()
for row in rows:
def_count += 1
for q in query:
spot.execute("INSERT INTO Definitions VALUES(?,?,?)", (def_count,query[q],word_count))
def_count += 1
return query
print dictionary(sys.argv[1])
Now, I wanted to practice OOP form by creating a class. I thought it would be best to separate this into at least a couple of functions too.
I came up with:
#! /usr/bin/env python
import mechanize
from BeautifulSoup import BeautifulSoup
import sys
import sqlite3
class Vocab:
def __init__(self):
self.word_count = 1
self.word = sys.argv[1]
self.def_count = 1
self.query = {}
def dictionary(self,word):
self.br = mechanize.Browser()
self.response = self.br.open('http://www.dictionary.reference.com')
self.br.select_form(nr=0)
self.br.form['q'] = word
self.br.submit()
self.definition = BeautifulSoup(self.br.response().read())
self.trans = self.definition.findAll('td',{'class':'td3n2'})
self.fin = [i.text for i in self.trans]
for i in self.fin:
self.query[self.fin.index(i)] = i
return self.query
def word_database(self):
self.con = sqlite3.connect('/home/oberon/vocab_database/vocab.db')
with self.con:
self.spot = self.con.cursor()
self.spot.execute("SELECT * FROM Words")
self.rows = self.spot.fetchall()
for row in self.rows:
self.word_count += 1
self.spot.execute("INSERT INTO Words VALUES(?,?)", (self.word_count,self.word))
self.spot.execute("SELECT * FROM Definitions")
self.rows = self.spot.fetchall()
for row in self.rows:
self.def_count += 1
for q in self.query:
self.spot.execute("INSERT INTO Definitions VALUES(?,?,?)", (self.def_count,self.query[q],self.word_count))
self.def_count += 1
Vocab().dictionary(sys.argv[1])
I know that on the last line when I call Vocab().dictionary(sys.argv[1]) this is only going to run the dictionary method. I am trying to figure out how to invoke the word_database method everytime I run the script still.
Is this the wrong way to go about this? Should I of just left these methods as just one large method?