RSS 피드를 feedparser로 구문 분석하고 SQLAlchemy를 사용하여 mySQL 테이블에 삽입하려고합니다. 나는 실제로 이것을 잘 실행시킬 수 있었지만 오늘 피드에는 설명에 줄임표 문자가있는 항목이 있었는데 다음과 같은 오류가 발생했습니다 :유니 코드 ellipsis가 mySQL 테이블에 올바르게 삽입되도록 SQLAlchemy를 얻으려면 어떻게해야합니까?
UnicodeEncodeError : 'latin-1'코덱은 문자 ' \ n2026 위치 35에 : 서수가 범위 내에 있지 않음 (256)
엔진에 convert_unicode = True 옵션을 추가하면 삽입 기능을 사용할 수 있지만 줄임표가 나타나지 않습니다. 문자. 이것은 내가 알고있는 한 라틴 -1에 수평 줄임표가 없기 때문에 의미가있는 것처럼 보입니다. 인코딩을 utf-8로 설정하더라도 차이가 나는 것 같지 않습니다. phpmyadmin을 사용하여 삽입을하고 줄임표를 포함하면 잘 돌아갑니다.
나는 문자 인코딩을 이해하지 못하거나 내가 지정한 것을 SQLAlchemy로 가져 오는 방법을 알고있다. 누구든지 이상한 문자없이 텍스트를 가져 오는 방법을 알고 있습니까?
UPDATE 내가이 일을 알아 낸하지만 난 그게 중요한 이유는 정말 모르겠어요 생각
... 여기
코드입니다 : 여기import sys
import feedparser
import sqlalchemy
from sqlalchemy import create_engine, MetaData, Table
COMMON_CHANNEL_PROPERTIES = [
('Channel title:','title', None),
('Channel description:', 'description', 100),
('Channel URL:', 'link', None),
]
COMMON_ITEM_PROPERTIES = [
('Item title:', 'title', None),
('Item description:', 'description', 100),
('Item URL:', 'link', None),
]
INDENT = u' '*4
def feedinfo(url, output=sys.stdout):
feed_data = feedparser.parse(url)
channel, items = feed_data.feed, feed_data.entries
#adding charset=utf8 here is what fixed the problem
db = create_engine('mysql://user:[email protected]/db?charset=utf8')
metadata = MetaData(db)
rssItems = Table('rss_items', metadata,autoload=True)
i = rssItems.insert();
for label, prop, trunc in COMMON_CHANNEL_PROPERTIES:
value = channel[prop]
if trunc:
value = value[:trunc] + u'...'
print >> output, label, value
print >> output
print >> output, "Feed items:"
for item in items:
i.execute({'title':item['title'], 'description': item['description'][:100]})
for label, prop, trunc in COMMON_ITEM_PROPERTIES:
value = item[prop]
if trunc:
value = value[:trunc] + u'...'
print >> output, INDENT, label, value
print >> output, INDENT, u'---'
return
if __name__=="__main__":
url = sys.argv[1]
feedinfo(url)
출력은 /입니다 charset 옵션을 사용하지 않고 코드를 실행하면 추적을 할 수 없습니다.
Channel title: [H]ardOCP News/Article Feed
Channel description: News/Article Feed for [H]ardOCP...
Channel URL: http://www.hardocp.com
Feed items:
Item title: Windows 8 UI is Dropping the 'Start' Button
Item description: After 15 years of occupying a place of honor on the desktop, the "Start" button will disappear from ...
Item URL: http://www.hardocp.com/news/2012/02/05/windows_8_ui_dropping_lsquostartrsquo_button/
---
Item title: Which Crashes More? Apple Apps or Android Apps
Item description: A new study of smartphone apps between Android and Apple conducted over a two month period came up w...
Item URL: http://www.hardocp.com/news/2012/02/05/which_crashes_more63_apple_apps_or_android/
---
Traceback (most recent call last):
File "parse.py", line 47, in <module>
feedinfo(url)
File "parse.py", line 36, in feedinfo
i.execute({'title':item['title'], 'description': item['description'][:100]})
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/expression.py", line 2758, in execute
return e._execute_clauseelement(self, multiparams, params)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2304, in _execute_clauseelement
return connection._execute_clauseelement(elem, multiparams, params)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1538, in _execute_clauseelement
compiled_sql, distilled_params
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1639, in _execute_context
context)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 330, in do_execute
cursor.execute(statement, parameters)
File "build/bdist.linux-i686/egg/MySQLdb/cursors.py", line 159, in execute
File "build/bdist.linux-i686/egg/MySQLdb/connections.py", line 264, in literal
File "build/bdist.linux-i686/egg/MySQLdb/connections.py", line 202, in unicode_literal
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2026' in position 35: ordinal not in range(256)
그래서 mysql을 연결 문자열에 harset 않았다. 나는 그것이 라틴어 -1로 기본 설정되어 있다고 가정합니까? content_engine의 인코딩 플래그를 utf8로 설정하려고 시도했지만 아무 것도하지 않았습니다. 누구든지 테이블과 필드가 utf8 유니 코드로 설정되어있을 때 왜 latin-1을 사용하는지 알 수 있습니까? 나는 또한 그것을 제거하기 전에 .encode ('cp1252')를 사용하여 항목 [ 'description]을 인코딩하려고 시도했다. 그리고 그것은 연결 문자열에 charset 옵션을 추가하지 않고도 잘 동작했다. 그건 latin-1에서 효과가 없었어야했는데 분명히 그랬을까요? 나는 해결책을 가지고 있지만 답 :
삽입하는 데 사용하는 코드를 표시 할 수 있습니까? 줄임표가 나오는 줄은 어디 있습니까? utf-8을 사용할 때 오류 메시지가 " 'latin-1'코덱을 말합니까? – geoffspear
문제가되는 데이터를 입력하십시오. 사용중인 코드를 제공 할 수 있다면 당신이하려고하는 것을 이해하는 것이 도움이 될 것입니다. :) – Nilesh
나는 위의 코드를 웹 사이트 hardocp.com에서 오는 줄임표와 함께 추가했습니다. 여기에 줄임표가있는 스 니펫이 있습니다. Microsoft는 몇 가지 좋은 것을 찾고 있습니다 ... .. 편견. 위 코드를 포함 시켰습니다. – kvedananda