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

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

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

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

SQL

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

Python

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

Q&A

解決済

2回答

1291閲覧

株の銘柄情報の取得とSQliteへの格納

tomomonX

総合スコア28

SQLite

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

SQL

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

Python

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

0グッド

0クリップ

投稿2021/06/20 12:58

編集2021/06/20 14:30

前提・実現したいこと

「株とPython-自作プログラムでお金儲けを目指す」とうpythonの書籍で勉強していまして、
銘柄情報の取得とSQLiteへの格納がしたいです。
下記リンクでもこの書籍の内容をなぞって実行できています。
https://bitop.hatenablog.com/entry/2019/04/09/060131

発生している問題

該当ソースコードで全部

python

1 if len(q.find('div.company_block')) == 0: 2 return None

の条件に当てはまってしまって、すべてNoneで返されてしまいます。
qはURLです。該当するURLでdiv.company_blockが存在しないときがこの条件に当てはまるということですよね?

該当のソースコード

python

1from pyquery import PyQuery 2import time 3import sqlite3 4 5 6def get_brand(code): 7 url = 'https://kabutan.jp/stock/?code={}'.format(code) 8 9 q = PyQuery(url) 10 11 if len(q.find('div.company_block')) == 0: 12 return None 13 14 try: 15 name = q.find('div.company_block > h3').text() 16 code_short_name = q.find('#stockinfo_i1 > div.si_i1_1 > h2').text() 17 short_name = code_short_name[code_short_name.find(" ") + 1:] 18 market = q.find('span.market').text() 19 unit_str = q.find('#kobetsu_left > table:nth-child(4) > tbody > tr:nth-child(6) > td').text() 20 unit = int(unit_str.split()[0].replace(',', '')) 21 sector = q.find('#stockinfo_i2 > div > a').text() 22 except (ValueError, IndexError): 23 return None 24 25 return code, name, short_name, market, unit, sector 26 27def brands_generator(code_range): 28 for code in code_range: 29 brand = get_brand(code) 30 if brand: 31 yield brand 32 time.sleep(1) 33 34def insert_brands_to_db(db_file_name, code_range): 35 conn = sqlite3.connect(db_file_name) 36 with conn: 37 sql = 'INSERT INTO brands(code,name,short_name,market,unit,sector) ' \ 38 'VALUES(?,?,?,?,?,?)' 39 conn.executemany(sql, brands_generator(code_range))

python

1insert_brands_to_db('brands.db',range(1301,1332))

確認したこと

例えば
https://kabutan.jp/stock/?code=1330で
div.company_blockは存在しているように思えます。
イメージ説明
###質問したいこと
参照リンクhttps://bitop.hatenablog.com/entry/2019/04/09/060131では
下記の条件にすべてが当てはまるわけではなく、うまく銘柄情報の取得とSQLへの格納ができています。
私がやると同じコードのはずなのに上手くいかないです。なぜでしょうか。

python

1 if len(q.find('div.company_block')) == 0: 2 return None

#追記
全部Noneで返されているかと思っていたのですが、勘違いでSQLiteに出力されていました。
#改めてためしたこと
下記を試して、try文が実行されていることが確認できました。
ただ、SQLiteにはなにも出力されていないように見えます。
https://bitop.hatenablog.com/entry/2019/04/09/060131では表が確認できるのに、
私の実行結果では確認できません。

def get_brand(code): url = 'https://kabutan.jp/stock/?code={}'.format(code) q = PyQuery(url) if len(q.find('div.company_block')) == 0: return None try: name = q.find('div.company_block > h3').text() code_short_name = q.find('#stockinfo_i1 > div.si_i1_1 > h2').text() short_name = code_short_name[code_short_name.find(" ") + 1:] market = q.find('span.market').text() unit_str = q.find('#kobetsu_left > table:nth-child(4) > tbody > tr:nth-child(6) > td').text() unit = int(unit_str.split()[0].replace(',', '')) sector = q.find('#stockinfo_i2 > div > a').text() print(q.find('div.company_block > h3').text())#tryが実行されているかここで確認 except (ValueError, IndexError): return None return code, name, short_name, market, unit, sector

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

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

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

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

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

guest

回答2

0

自己解決

自己解決できました。
アップロード元ばかり見てましたが、アップロード先で実行できていました。

投稿2021/06/20 15:36

tomomonX

総合スコア28

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

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

0

さっと見ただけですが、ノードの階層のmainエレメントより下のノードを指定する必要があるようですね。

q.find('#kobetsu_right > div.company_block')

のような親ノードも付加してみましょう。

投稿2021/06/20 13:57

seastar3

総合スコア2287

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

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

tomomonX

2021/06/20 14:32

回答ありがとうございます。いろいろ試してて、私の確認内容に誤りがあったことがわかりました。失礼しました。しかしいまだにDB Browserで表を確認できず困っており、引き続き原因を探っています。 なんとなくpythonというよりDB Broserの使い方のような気もしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問