質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

2回答

2858閲覧

seleniumでスクレイピングしたデータをsqlite3を使ったデータベースで一つ一つfor文で回してスクレイピングしたデータを取得していきたい

sakanaku

総合スコア17

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2020/08/09 02:00

編集2020/08/09 04:22

前提・実現したいこと

こんにちわ。python初学者です。
seleniumでスクレイピングしたデータをsqlite3を使ったデータベースで一つ一つfor文で回してスクレイピングしたデータを取得していきたいのですが、下記のようなエラーが出てしまいます。シンタックスエラーということでいろいろコードを見直しても直りません。
そして、スクレイピングはできているようなのですが、データベースに格納することができません、、、これは根本的に大幅にコードが間違っているんでしょうか?(テーブルとカラムはできてそうです。)
下記のようなエラーはどこのコード部分を直せば良いでしょうか??すいませんお力いただきたいです。
よろしくお願いします。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "/Users/uu/Pycha/so/sample.py", line 50, in <module> insert_data(table_create, test) File "/Users/uu/Pycha/so/sample.py", line 41, in insert_data c.execute(insert, date) sqlite3.OperationalError: near "<": syntax error
from selenium import webdriver import chromedriver_binary from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options import sqlite3 options = Options() options.headless = True options.add_argument('--headless') db = "sample.db" conn = sqlite3.connect(db) c = conn.cursor() table_name = "テーブル名" def get_date(): driver = webdriver.Chrome(options=options) driver.get("webサイトURL") selector = '要素' element = driver.find_elements_by_css_selector(selector) for a in element: b = a.get_attribute("href") print(b) date_element = "要素" date = driver.find_elements_by_css_selector(date_element) for c in date: d = c.text print(d) def tab(ta): t = """create table if NOT EXISTS {} (we varchar(64), date varchar(32));""".format(ta) c.execute(t) def inda(ta, date): insert = 'insert into {} (we, date) values (?,?);'.format(ta, date) c.execute(insert, date) conn.commit() s = 'select * from {};'.format(table_name) for a in c.execute(s): print(a) conn.close() tab(table_name) test = get_date() inda(tab, test)
Python sqlite3

試したこと

関数なしでコードを書きましたがそちらでも詰まってしまいました。

def inda(ta, date): insert = 'insert into {} (we, date) values (?,?);'.format(ta, date) print(insert) print(date) c.execute(insert, date) conn.commit()

この関数の中の
c.execute(insert, date)
の前に
print(insert)
print(date)
こちらを出力しましたが同じエラーが出てしまいした。。。

補足情報(FW/ツールのバージョンなど)

python3.7 mac10.15 pycharm

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/08/09 02:13

・コードは「コードの挿入」で記入してください。 ・エラーメッセージは全文掲載しましょう。 > シンタックスエラーということでいろいろコードを見直しても直りません。 どこをどのように見直しましたか?
sakanaku

2020/08/09 03:38

すいません、みなさんご指摘ありがとうございます。書式とエラーメッセージの全文の追加させていただきました。 > シンタックスエラーということでいろいろコードを見直しても直りません。 どこをどのように見直しましたか? こちらは insert = 'insert into {} (we, date) values (?,?);'.format(ta, date) このあたりのコードが怪しいかな?と思い”;”この記号が入れ忘れていたので追加したりしましたが変わりませんでした。 他に改善や文法がおかしいというのはたくさんあるのでしょうか、、、??
can110

2020/08/09 03:42

エラーがはっせいする「c.execute(insert, date)」行の前に print(insert) print(date) を入れて実行した結果を記載ください。
sakanaku

2020/08/09 03:55 編集

/Users/uu/Pycha/so/venv/bin/python /Users/uu/Pycha/so/sample.py Started running on Aug 5, 2020 Started running on Aug 4, 2020 Started running on Aug 4, 2020 Started running on Aug 3, 2020 Started running on Jul 30, 2020 Started running on Jul 30, 2020 Started running on Jul 30, 2020 Started running on Jul 30, 2020 Started running on Jul 30, 2020 Started running on Jul 30, 2020 Started running on Jul 30, 2020 Started running on Jul 30, 2020 Started running on Jul 30, 2020 Started running on Jul 29, 2020 Started running on Jul 29, 2020 Started running on Jul 29, 2020 insert into <function table_create at 0x10231c680> (kigyou, date) values (?,?); None Traceback (most recent call last): File "/Users/uu/Pycha/so/sample.py", line 53, in <module> insert_data(table_create, test) File "/Users/uu/Pycha/so/sample.py", line 44, in insert_data c.execute(insert, date) sqlite3.OperationalError: near "<": syntax error Process finished with exit code 1 回答ありがとうございます。c.execute(insert, date)行の前に print(insert) print(date) 実行結果は上記のようになりました。すいませんよろしくおねがいします。
meg_

2020/08/09 04:03

エラーメッセージには「insert_data(table_create, test)」とありますが、質問のコード中にはこの一文はありません。エラー発生場所は別のスクリプトなのでしょうか?
sakanaku

2020/08/09 04:09

すいません、改善前のコードで実行していました。 先ほどの実行したらまた別のシンタックスエラーが出ちゃいました、、 /Users/uu/Pycha/so/venv/bin/python /Users/uu/Pycha/so/samp.py Traceback (most recent call last): File "/Users/uu/Pycha/so/samp.py", line 55, in <module> tab(table_name) File "/Users/kawamuraryuu/PycharmProjects/training-soh/situmon.py", line 38, in tab c.execute(t) sqlite3.OperationalError: near "(": syntax error Process finished with exit code 1
sakanaku

2020/08/09 04:15

/Users/uu/Pycha/so/venv/bin/python /Users/uu/Pycha/so/samp.py https://www.sample.com insert into <function tab at 0x110d9a5f0> (we, date) values (?,?); None Traceback (most recent call last): File "/Users/uu/Pycha/so/samp.py", line 56, in <module> inda(tab, test) File "/Users/uu/Pycha/so/samp.py", line 45, in inda c.execute(insert, date) sqlite3.OperationalError: near "<": syntax error Process finished with exit code 1 何度もすいません、先ほどの上記の sqlite3.OperationalError: near "(": syntax error こちらのシンタックスエラーは改善できましたが、同じエラーは出てしまいます、、、
guest

回答2

0

ベストアンサー

バグ1 inda() の引数誤り

inda() の第一引数にテーブル名をいれるような作りなのに、tab という関数を入れてしまっています。

INSERT文実行前にprint(insert) してみると、
insert into <function tab at 0x7fa3f3cec670> (we, date) values (?,?);
となっているので、これはSQLとしてありえないです。

バグ2 INSERT文の実行方法誤り

INSERT INTO テーブル名 (we, date) values (?, ?) というように ? を使ったところはいいのですが
? に入る値の指定を execute時にしないといけないのにそれが抜けています。

バグ3 get_dateが値を返さない

can110さんのご指摘の通り

とりあえず動きそうなコード

get_date以外を直してみました。

python

1 2# indaは全文掲載 3def inda(ta, we, date): 4 # insert = 'insert into {} (we, date) values (?,?);'.format(ta, date) # ここにdateは不要 5 insert = 'insert into {} (we, date) values (?,?);'.format(ta) 6 # c.execute(insert, date) # ?が2個あるのに値が1個しかない 7 c.execute(insert, [we, date]) # ? を使ったときの ? に入れる値はここで配列にして指定する 8 conn.commit() 9 print("committed") 10 11 s = 'select * from {};'.format(table_name) 12 for a in c.execute(s): 13 print(a) 14 # conn.close() #ここでcloseしてしまったらデータが1件しか取れない。 15 16 conn.close() # 動くように移動しましたがcloseせずにプログラムの最後でしたほうがよいです 17 18 19tab(table_name) 20test = get_date() 21inda(table_name, "we_no_data", "date_no_data") # とりあえず固定値にしています

投稿2020/08/09 04:33

編集2020/08/09 04:50
YakumoSaki

総合スコア2027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakanaku

2020/08/09 06:48

詳しいご回答ありがとうございます。 先程、inda()の中のコードをご教授いただいたコードに変えさせてもらうと無事に空のデータですが、SQLが動いてそうです。ありがとうございます。 ちなみになのですが、get_date()の返り値はどのようなのが妥当なのでしょうか?? 先程まで試行錯誤していたのですが、 print(b)とprint(d)を削除して、関数の最後にreturn [(b, d )] としてもエラーがでてしまいます。 すいません、今出先でエラー文を掲載することができません、、、 もしよかったら簡単な返り値のアドバイスあればぜひお願いしたいです。 よろしくお願いします。
YakumoSaki

2020/08/09 07:00 編集

ごめんなさい、質問文とコードからスクレイピングの結果、何を取得したいのかわからないので なんとも言えません。 質問の内容が変わってしまっているので、現状を整理する意味でも、新しく質問を立てた方が回答がつきやすいと思います。 その際、サイトのURL等を伏せていらっしゃるのでどういうサイトからどういう情報を取得したいのか 質問に書いていただけると回答がつきやすいと思います。
sakanaku

2020/08/09 11:21

すいません、質問の仕方も難しいな。と感じていたそこのアドバイスまでいただき本当にいろいろと助かりました。 いろいろとまずは自分でやってみてどうしても分からなかったらまた質問を立てようと思います。 すいません、ありがとうございました。 ありがとうございました。
guest

0

Python

1tab(table_name) 2test = get_date() 3inda(tab, test)

inda(tab, test)にてtabという関数を渡しているため提示エラーが発生しています。
おそらくtable_nameを渡すべきではないでしょうか?

またget_data関数は何もreturnしていないのでtestにはNoneが代入されます。
適切な値を返す必要があります。

投稿2020/08/09 04:30

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakanaku

2020/08/09 06:52

table_nameを渡してコードを上記のアドバイスをいただいてデータベースが空ではありますが機能している感じになりました。ありがとうございます。 ちなみになのですが >>またget_data関数は何もreturnしていないのでtestにはNoneが代入されます。 適切な値を返す必要があります。 こちらって現在の掲載しているコードみただけで返り値は分かるものでしょうか?? もしよかったらご教授願いたいです。 すいません、よろしくお願いします。
can110

2020/08/09 08:48

> こちらって現在の掲載しているコードみただけで返り値は分かるものでしょうか?? はい。returnがない場合はNoneが返る仕様なので返り値はNoneであると分かります。
sakanaku

2020/08/09 11:20

ご回答ありがとうございます。返り値をちゃんと指定できるよう勉強して動かしていきます。 丁寧に教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問