PostgreSQLに、SQLAlchemyを用いて接続し、モデルを定義の上、フォルダ内のテキスト(Html形式)をデータベースに追加しようとしています。
以下のコードを実行したところ、以下のようなエラーメッセージが出てしまいます。申し訳ありません。どなかたエラーの原因がわかる方、ご教示いただけないでしょうか。
どうぞよろしくお願い申し上げます。
AttributeError
Traceback (most recent call last)
/opt/conda/lib/python3.7/site-packages/sqlalchemy/orm/session.py in add(self, instance, _warn)
1942 try:
-> 1943 state = attributes.instance_state(instance)
1944 except exc.NO_STATE:
AttributeError: 'tuple' object has no attribute '_sa_instance_state'
During handling of the above exception, another exception occurred:
UnmappedInstanceError
Traceback (most recent call last)
<ipython-input-33-81f0ea7b0027> in <module>
9 print('scraped:', title)
10 url = 'https://ja.wikipedia.org/wiki/{0}'.format(urllib.parse.quote(title))
---> 11 session.add((text, json.dumps({'url': url, 'title': title})))
12 session.commit()
13 session.close()
/opt/conda/lib/python3.7/site-packages/sqlalchemy/orm/session.py in add(self, instance, _warn)
1943 state = attributes.instance_state(instance)
1944 except exc.NO_STATE:
-> 1945 raise exc.UnmappedInstanceError(instance)
1946
1947 self._save_or_update_state(state)
UnmappedInstanceError: Class 'builtins.tuple' is not mapped
python
1import sqlalchemy 2from sqlalchemy import create_engine 3from sqlalchemy.engine.url import URL 4url = URL(drivername='postgresql', username='postgres', password = '<password>', host = 'localhost', database = 'test') 5url 6engine = create_engine(url) 7engine 8from sqlalchemy.ext.declarative import declarative_base 9from sqlalchemy import Column, Integer, String 10Base = declarative_base() 11class User(Base): 12 __tablename__ = 'users' 13 14 id = Column(Integer, primary_key=True) 15 content = Column(String) 16 meta_info = Column(String) 17 18from sqlalchemy.orm import sessionmaker 19session = sessionmaker(bind=engine)() 20import re 21import unicodedata 22 23from bs4 import BeautifulSoup 24translation_table = str.maketrans(dict(zip('()!', '()!'))) 25 26def cleanse(text): 27 text = unicodedata.normalize('NFKC', text).translate(translation_table) 28 text = re.sub(r'\s+', ' ', text) 29 return text 30 31def scrape(html): 32 soup = BeautifulSoup(html, 'html.parser') 33 # __EOS__ の挿入 34 for block in soup.find_all(['br', 'p', 'h1', 'h2', 'h3', 'h4']): 35 if len(block.text.strip()) > 0 and block.text.strip()[-1] not in ['。', '!']: 36 block.append('<__EOS__>') 37 # 本文の抽出 38 text = '\n'.join([cleanse(block.text.strip()) 39 for block in soup.find_all(['p', 'h1', 'h2', 'h3', 'h4']) 40 if len(block.text.strip()) > 0]) 41 # タイトルの抽出 42 title = cleanse(soup.title.text.replace(' - Wikipedia', '')) 43 return text, title 44 45import glob 46import urllib.request 47import json 48users = [] 49for filename in glob.glob('./data/wikipedia/*.html'): 50 with open(filename) as fin: 51 html = fin.read() 52 text, title = scrape(html) 53 print('scraped:', title) 54 url = 'https://ja.wikipedia.org/wiki/{0}'.format(urllib.parse.quote(title)) 55 session.add((text, json.dumps({'url': url, 'title': title}))) 56 session.commit() 57 session.close() 58コード
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。