Qual è la procedura corretta per archiviare un flusso rss codificato utf-16 in sqlite3 usando Python

StackOverflow https://stackoverflow.com/questions/457641

  •  19-08-2019
  •  | 
  •  

Domanda

Ho uno script python sgi che tenta di estrarre un oggetto rss che vi è inviato e di archiviare l'rss in un sqlite3 db. Sto usando flup come WSGIServer.
Per ottenere il contenuto pubblicato:     postData = ambi [" wsgi.input "]. read (int (environment [" CONTENT_LENGTH "]))

Per tentare di archiviare nel 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,))

Ciò comporta che solo i primi caratteri dell'rss vengano memorizzati nel record: # 255 &; # 254 &; Lt &; Credo che i caratteri iniziali siano la DBA dell'rss.

Ho provato ogni permutazione che potevo pensare di includere prima la codifica rss come utf-8 e quindi tentare di memorizzare ma i risultati erano gli stessi. Non ho potuto decodificare perché alcuni personaggi non potevano essere rappresentati come unicode.

Esecuzione di Python 2.5.2 sqlite 3.5.7

Grazie in anticipo per eventuali approfondimenti su questo problema.


Ecco un esempio dei dati iniziali contenuti in postData come modificati dalla funzione repr, scritti in un file e visualizzati con meno:

'\ XEF \ xbb \ XBF

Grazie per tutte le risposte! Molto utile.


L'esempio che ho inviato non è riuscito a superare i filtri html dello stackoverflow, riprovando, convertendo sempre meno in entità (l'anteprima indica che funziona).

\ xef \ xbb \ xbf <? versione xml = " 1.0 " encoding = " utf-16 "? > < rss xmlns: xsi = " http: //www.w3.org/2001/XMLSchema- & istanza quot; xmlns: xsd = " http: //www.w3.org/2001/XMLSchema " > < canale > < articolo d3p1 : &; & size = quot 0 quot; xsi: &; & type = quot tFileItem quot; &: Xmlns = d3p1 quot; http: &; & //Htinc.com/opensearch-ex/1.0/ quot gt;

È stato utile?

Soluzione

Prima dell'inserimento di SQL è necessario convertire la stringa in stringhe unicode compatibili. Se sollevi un'eccezione UnicodeError, codifica string.encode (& Quot; utf-8 & Quot;).

Oppure, puoi rilevare automaticamente la codifica e codificarla, sul suo schema di codifica. Codifica rilevamento automatico

Altri suggerimenti

Per quanto riguarda la codifica di inserimento, in qualsiasi API di database decente, è necessario inserire unicode stringhe e <=> solo stringhe.

Per il bit di lettura e analisi, consiglio Feed Parser di Mark Pilgrim . Gestisce correttamente la distinta componenti e la licenza consente l'uso commerciale. Questo potrebbe essere un po 'troppo pesante se non stai eseguendo un'analisi effettiva sui dati RSS.

Sei sicuro che i tuoi dati in arrivo siano codificati come UTF-16 (altrimenti noto come UCS-2)?

Le stringhe unicode codificate UTF-16 in genere includono molti caratteri NUL (sicuramente per tutti i caratteri esistenti anche in ASCII), quindi i dati UTF-16 difficilmente possono essere memorizzati in variabili di ambiente (le variabili in POSIX sono terminate NUL).

Fornisci esempi del postData contenuto della variabile. Esegui l'output utilizzando repr().

Fino ad allora, il solido consiglio è: in tutte le interazioni DB, le stringhe sul lato Python dovrebbero essere stringhe unicode; l'interfaccia DB dovrebbe occuparsi di tutte le traduzioni / codifiche / decodifiche necessarie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top