4

私はPythonでsqlite3を使用することを学んでいます。現在、インターネット上で単語を取得してその単語の定義を検索する機能があります。次に、単語を1つのテーブルに格納し、定義を外部キーでリンクされた別のテーブルに格納しようとします。

このような:

#! /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('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,q,word_count)
    return query

print dictionary(sys.argv[1]) 

私がそれを実行するとき:

./database_trial.py 'pass'

これはエラーメッセージです:

Traceback (most recent call last):
  File "./database_trial.py", line 37, in <module>
    print dictionary(sys.argv[1])  
  File "./database_trial.py", line 28, in dictionary
    spot.execute("INSERT INTO Words VALUES(?,?)", word_count,word)
TypeError: function takes at most 2 arguments (3 given)

関数内では、「Words」テーブルに渡される引数は2つだけですが、メッセージには3つあると書かれています。

spot.execute("INSERT INTO Words VALUES(?,?)", word_count,word) 

sys.argvで何かを台無しにしているのではないかと思います。そこで、私はその行を次のように変更しました。

spot.execute("INSERT INTO Words VALUES(?,?)", word_count, sys.argv[1])

エラーメッセージでも同じ結果が得られますか?

4

2 に答える 2

8
spot.execute("INSERT INTO Words VALUES(?,?)", word_count,word) 

There are three arguments being passed to the method spot.execute: the SQL string, the variable word_count, and the variable word. I suspect the values to enter into the database need to be enclosed in a tuple to form a single argument:

spot.execute("INSERT INTO Words VALUES(?,?)", (word_count,word))
于 2012-08-13T21:46:47.570 に答える
3

executeパラメータは 2 つだけです。2 つ目は、準備済み SQL ステートメントで使用するすべての値のタプルです。だから、代わりに

spot.execute("INSERT INTO Words VALUES(?,?)", word_count,word)

すべての値をタプルにラップします。

spot.execute("INSERT INTO Words VALUES(?,?)", (word_count, word) )
#                                             ^                ^
于 2012-08-13T21:47:25.263 に答える