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

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

ただいまの
回答率

90.50%

  • Python

    7996questions

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

  • MySQL

    5856questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

pythonからMySQLへのデータの挿入(オブジェクトエラー)

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 215

RenNearco

score 1

 前提・実現したいこと

このページのデータをスクレイピングし、MySQlへ挿入したいのですが、
挿入するところで以下のエラーメッセージが発生します。

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

Traceback (most recent call last):
  File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mysql/connector/connection_cext.py", line 377, in c
md_query
    raw_as_string=raw_as_string)
_mysql_connector.MySQLInterfaceError: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to
 use near 'values (742976, ディープインパクト, Deep Impact, JPN, 繁殖, サラ, ' at line 1

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "horse_q.py", line 76, in <module>
    profile['市場取引'], profile['繋養先'], profile['種付料']))
  File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mysql/connector/cursor_cext.py", line 264, in execu
te
    raw_as_string=self._raw_as_string)
  File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mysql/connector/connection_cext.py", line 380, in c
md_query
    sqlstate=exc.sqlstate)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for th
e right syntax to use near 'values (742976, ディープインパクト, Deep Impact, JPN, 繁殖, サラ, ' at line 1

 修正

以下のように%をつけました。 単純にSQLが間違っているのでしょうか。

 該当のソースコード

未完ですが、以下ソースコードです。

import mysql.connector
import urllib.request, urllib.error
from bs4 import BeautifulSoup
import re

connect = mysql.connector.connect(
    host='localhost', user='root', passwd='********', db='horse_test', charset='utf8')
cursor = connect.cursor()

# プロフィールの項目
profile_key_list = ['登録', '品種', '性別', '生年月日', '馬主', '毛色',
                    '調教師', '生産牧場', '産地', '戦績', '総賞金',
                    '市場取引', '繋養先', '種付料']
profile_dict = {i: [] for i in profile_key_list}
profile = {i: [] for i in profile_key_list}

start = 742976
stop = start

while start <= stop:

    url = urllib.request.urlopen('http://www.jbis.or.jp/horse/' + '{0:010d}'.format(start) + '/')
    html = BeautifulSoup(url, 'lxml')

    try:
        name_ja = html.find('h1', class_='hdg-l1-02').text
        name_en = html.find('div', class_='sup').text.strip().splitlines()[0]
        if name_ja == '_________':
            name_ja, name_en = 'unknown', 'unknown'
        elif '現在' in name_en:
            name_en = None
    except:
        name_ja,name_en = None, None

    try:
        country = re.search(re.compile(r'\(.+?\)'), (name_ja + name_en))[0]
    except:
        country = 'unk'
    name_ja, name_en = name_ja.replace(country, ''), name_en.replace(country, '')
    if name_en == '':
        name_en = None
    country = country.replace('(', '').replace(')', '')

    try:
        profile_table_html = html.find_all('table', class_='tbl-data-05')
        profile_table_text = profile_table_html[0].text.replace(' (アラブ血量)', '\n')
        profile_list = [i for i in profile_table_text.splitlines() if i not in ['', u'\xa0']]
    except:
        profile_list = []

    key = profile_list[0]
    assert key in profile_list

    for i in profile_list[1:]:
        if i in profile_dict:
            key = i
        elif i.strip() == '写真':
            break
        else:
            profile_dict[key].append(i.strip().replace(u'\u3000', ''))

    for i in profile_dict:
        profile[i] = ''.join(profile_dict[i])

    cursor.execute('insert into horse \
                    (id, name_ja, name_en, country, \
                     state, kind, sex, date_of_birth, owner, coat_color, \
                     trainer, breeding_farm, producting_area, past_performance, earning, \
                     market, maintin_farm, stud_fee \
                    values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)' %
                    (start, name_ja, name_en, country,
                     profile['登録'], profile['品種'], profile['性別'],
                     profile['生年月日'], profile['馬主'], profile['毛色'],
                     profile['調教師'], profile['生産牧場'], profile['産地'],
                     profile['戦績'], profile['総賞金'],
                     profile['市場取引'], profile['繋養先'], profile['種付料']))

    start += 1

# 保存
connect.commit()
connect.close()

 試したこと

エラーメーセージで検索して色々調べたんですが、
調べ方が悪いのか原因が分かりませんでした。
「こう調べれば良いよ」等だけでも教えていただきたいです。

以上、よろしくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

註: 編集前の質問に対する回答です。

%を忘れてませんか?

>>> s1 = 'spam'
>>> s2 = 'ham'
>>> s3 = 'egg'
>>>
>>> '1 %s 2 %s 3 %s' % (s1, s2, s3)
'1 spam 2 ham 3 egg'
>>>
>>> '1 %s 2 %s 3 %s' (s1, s2, s3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/28 18:38

    ありがとうございます。
    修正しましたが、別のエラーが出てしまいました。

    キャンセル

  • 2018/07/28 18:45

    すみません、SQLについては全然わかりません。
    他の回答が付くのを待つか、新たに質問を立ててください。

    キャンセル

  • 2018/07/28 18:52

    承知致しました。
    いつも回答していただきありがとうございます。

    キャンセル

+1

SQLは詳しくないですが、、、

'insert into horse \
                    (id, name_ja, name_en, country, \
                     state, kind, sex, date_of_birth, owner, coat_color, \
                     trainer, breeding_farm, producting_area, past_performance, earning, \
                     market, maintin_farm, stud_fee \

id の前の括弧が閉じてないです。
stud_fee の次に 閉じ括弧 ')' が来るのではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/01 02:10

    stud_feeの次に)を付けても同様のエラーが出てしまいます。

    キャンセル

check解決した方法

0

valuesの行を下記の通りにしたら無事挿入できました。
旧:values (%s, %s, …… %s, %s)' %
新:values (%s, %s, …… %s, %s)',

cursor.execute('insert into horse \
                (id, name_ja, name_en, country, \
                 state, kind, sex, date_of_birth, owner, coat_color, \
                 trainer, breeding_farm, producting_area, past_performance, earning, \
                 market, maintin_farm, stud_fee) \
                values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)',
                (start, name_ja, name_en, country,
                 profile['登録'], profile['品種'], profile['性別'],
                 profile['生年月日'], profile['馬主'], profile['毛色'],
                 profile['調教師'], profile['生産牧場'], profile['産地'],
                 profile['戦績'], profile['総賞金'],
                 profile['市場取引'], profile['繋養先'], profile['種付料']))

回答してくださった方ありがとうございました。
(о´∀`о)(*´∇`*)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7996questions

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

  • MySQL

    5856questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。