2

投稿されたRSSアイテムを抽出し、RSSをsqlite3 dbに保存しようとするpython sgiスクリプトがあります。WSGIServer として flup を使用しています。
投稿されたコンテンツを取得するには: postData = Environment["wsgi.input"].read(int(environ["CONTENT_LENGTH"]))

db に格納するには:

from pysqlite2 import dbapi2 as sqlite
ldb = sqlite.connect("/var/vhost/mysite.com/db/rssharvested.db")
lcursor = ldb.cursor()
lcursor.execute("INSERT into rss(data) VALUES(?)", (postData,))

これにより、rss の最初の数文字だけがレコードに保存されます: ÿþ< 最初の文字は rss の BOM だと思います。

最初にrssをutf-8としてエンコードしてから保存しようとするなど、考えられるすべての順列を試しましたが、結果は同じでした。一部の文字が Unicode として表現できなかったため、デコードできませんでした。

Python 2.5.2 sqlite 3.5.7 の実行

この問題についての洞察を事前に感謝します。


以下は、repr 関数によって変更された postData に含まれる初期データのサンプルで、ファイルに書き込まれ、less で表示されます。

'\xef\xbb\xbf

すべての返信をありがとう!非常に役立ちます。


私が提出したサンプルは、stackoverflow html フィルターを通過しませんでした。再試行し、エンティティに以下と大なりを変換します (プレビューでは、これが機能することを示しています)。

\xef\xbb\xbf<?xml version="1.0" encoding="utf-16"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema"><channel><item d3p1:size="0" xsi:type="tFileItem" xmlns:d3p1="http://htinc.com/opensearch- ex/1.0/">

4

3 に答える 3

1

入力データが UTF-16 (別名 UCS-2) としてエンコードされていることを確認しますか?

UTF-16 でエンコードされた Unicode 文字列には通常、多くの NUL 文字が含まれているため (ASCII にも存在するすべての文字について)、UTF-16 データを環境変数に格納することはほとんどできません (POSIX の環境変数は NUL で終了します)。

postData可変コンテンツのサンプルを提供してください。を使用して出力しますrepr()

それまでは、確実なアドバイスは次のとおりです。すべての DB インタラクションで、Python 側の文字列は Unicode 文字列にする必要があります。DB インターフェースは、必要なすべての翻訳/エンコード/デコードを処理する必要があります。

于 2009-01-19T18:34:14.470 に答える
1

挿入エンコードについて - 適切なデータベース API では、unicode文字列とunicode文字列のみを挿入する必要があります。

読み取りと解析については、Mark Pilgrim のFeed Parserをお勧めします。BOM を適切に処理し、ライセンスにより商用利用が許可されます。 RSS データを実際に解析していない場合、これは少し重すぎるかもしれません。

于 2009-01-19T14:04:45.390 に答える
0

SQL を挿入する前に、文字列を Unicode 互換の文字列に変換する必要があります。UnicodeError 例外が発生した場合は、string.encode("utf-8") をエンコードします。

または、彼のエンコード スキーマでエンコードを自動検出してエンコードすることもできます。 エンコードの自動検出

于 2009-01-19T14:36:03.487 に答える