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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

SQLite

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

Python

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

Q&A

解決済

1回答

619閲覧

PythonでスクレイピングしてきたデータをSQLiteに挿入する部分のコード

退会済みユーザー

退会済みユーザー

総合スコア0

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

SQLite

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

Python

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

0グッド

0クリップ

投稿2018/01/03 14:45

###前提・実現したいこと
現在手入力の部分のデータをスクレイピングしてきたデータをSQLiteに入れる部分のコードを書いています。参考にして動かしているコードが理解できず、自分が書きたいコードに応用することができていません。参考にしているコード(train3.py)

###該当のソースコード
手入力で[1000000, "チョコレート", 120]というデータをSQLiteに挿入できているコード
この(code, name, price)にあたる[1000000, "チョコレート", 120]の部分を以下のようにスクレイピングで取得した時、

python

1v['code'] = elem.text.strip() 2v['name'] = elem.text.strip() 3v['price'] = elem.text.strip()

python

1con.execute("INSERT INTO master_data (code, name, price)VALUES (?, ?, ?)", [v['code'], v['name'], v['price'])

のように書いてもうまくいかず、どのようにすればいいのかアドバイスをいただきたいです。

Python

1import sqlite3 2 3#create database 4con = sqlite3.connect("master_data.sqlite3") 5 6#create a database 7sql = u""" 8create table if not exists master_data ( 9 code integer, 10 name varchar(100), 11 price integer 12); 13""" 14con.execute(sql) 15 16#insert a data 17con.execute("INSERT INTO master_data (code, name, price)VALUES (?, ?, ?)", [1000000, "チョコレート", 120]) 18 19#retrieve records 20c = con.cursor() 21c.execute(u"select * from master_data") 22for row in c: # rowはtuple 23 print(row[0], row[1], row[2])

Python

1# -*- coding: utf-8 -*- 2 3from bs4 import BeautifulSoup 4import urllib.request as req 5import sqlite3 6import re 7 8url = "http://www.keishicho.metro.tokyo.jp/kurashi/higai/kodomo/fushin/20_fushin.html" 9dbname = 'database.db' 10conn = sqlite3.connect(dbname) 11c = conn.cursor() 12table_name = 'test' 13 14# train1の部分 15def get_html(): 16 # urlopen()でデータを取得 17 res = req.urlopen(url) 18 19 # BeautifulSoup()で解析 20 soup = BeautifulSoup(res, 'html.parser') 21 22 # 任意のデータを抽出 23 main = soup.find("div", id="main").find("div", class_="main_inner").find("div", class_="t-box2") 24 news_list = main.find("table").find_all("tr") 25 26 res = [] 27 for news in news_list: 28 res += get_res(news) 29 30 return res 31 32# 記事から情報を抜き出すところ 33def get_res(news): 34 place = news.find('th').string 35 main = news.find('td').find('p').text 36 main_list = re.match('(.*警察署)([0-9]{1,2})月([0-9]{1,2})日((.)曜)、(.*)ころ、(.*)不審者の特徴:(.*)', main).groups() 37 police = main_list[0] 38 date = main_list[1] + main_list[2] + main_list[3] 39 time = main_list[4] 40 body = main_list[5] 41 feature = main_list[6] 42 43 return [(place, police, date, time, body, feature)] 44 45 46def drop_table(tname): 47 # executeメソッドでSQL文を実行する 48 create_table = '''drop table if EXISTS {} '''.format(tname) 49 c.execute(create_table) 50 51# train2の部分 52def create_table(tname): 53 # executeメソッドでSQL文を実行する(型はひとまずcharで入れてます...) 54 create_table = ''' 55create table if NOT EXISTS {} ( 56 place varchar(64), 57 police varchar(32), 58 date varchar(64), 59 time varchar(64), 60 body varchar(64), 61 feature varchar(64))'''.format(tname) 62 c.execute(create_table) 63 64def insert_data(tname, data): 65 # 一度に複数のSQL文を実行したいときは,タプルのリストを作成した上で 66 # executemanyメソッドを実行する 67 insert_sql = 'insert into {0} (place, police, date, time, body, feature) values (?,?,?,?,?,?)'.format(tname) 68 c.executemany(insert_sql, data) 69 conn.commit() 70 71def select_all(tname): 72 select_sql = 'select * from {0}'.format(table_name) 73 res = "" 74 for row in c.execute(select_sql): 75 res += str(row) 76 return res 77 78 79if __name__ == '__main__': 80 drop_table(table_name) 81 create_table(table_name) 82 test = get_html() 83 insert_data(table_name, test) 84 print(select_all(table_name)) 85 86 87 conn.close()

###補足情報(言語/FW/ツール等のバージョンなど)
Python 2.7.12
SQLite3 3.11.0

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

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

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

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

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

can110

2018/01/04 06:19

pythonバージョンは間違いなく2.7でしょうか(urllib.requestは2.xは存在しないはず)?また「うまくいかない」の詳細を追記ください(当方環境では正常に動作)
退会済みユーザー

退会済みユーザー

2018/01/04 06:48

解決しました。ご指摘いただきましてありがとうございました。
guest

回答1

0

ベストアンサー

Python

1con.execute("INSERT INTO master_data (code, name, price)VALUES (?, ?, ?)", [v['code'], v['name'], v['price']]) 2```

投稿2018/01/04 06:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問