|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() TALN:inférence grammaticale Inscription : avril 2010 Messages : 16 ![]() |
Bonjour,
actuelement j'esseye d'implémter un prog qui lit le contenu d'une page html et copie le contenu sur un fichier TXT. j'ai réussi a l'implémenté avec codage et encodage UTF-8, le résultat (le contenu des fichier text) seront analysé par un autre logiciel . selement voilà ce logiciel n'accepte que les fichier codé en utf-16. j'ai utilisé le même programme que j'ai développé pour utf-8 en remplaçant .encode('utf8') et .decode ('utf8') par utf-16.(voir ci dessous) mais lors de l'exécution il m'a généré des erreurs et n'a pas pu s'exécuter, #C:/python27 # -*- coding: utf-16 -*- def lire_ecrire_fichier_txt(url, name_file): print "décut de l'éxécution" htmlSource = urllib.urlopen(url).read().decode('utf-16') text=htmlSource.lower().split('<p')[1:] path = createFile(name_file) f = open(path, "a") title=htmlSource.lower().split('<title>')[1:] for i in title: if (i[:i.find('</title>')]!=-1): txt= i[:i.find('</title>')] text=enlever_balise(txt) text=netoyer_text(text) if text!= '': f.write((text+'\n').encode('utf-16')) for chunk in htmlSource.lower().split('<p')[1:]: if(chunk.find('</p>')!=-1): if chunk[0] != '<': text= chunk[:chunk.find('</p>')]+"\n" txt= chunk[:chunk.find('</p>')]+"\n" text=enlever_balise(txt) text=netoyer_text(text) if text!= '': f.write((text+'\n').encode('utf-16')) f.close() nb_token(path) |
|
|
00
|
|
|
#2 | |||
|
Membre Expert
![]() ![]() Inscription : octobre 2008 Messages : 942 ![]() |
Salut,
Quelles erreurs ? Il serait bien de montrer le traceback. Une remarque: ton script ne doit pas être obligatoirement en utf-16 pour ce que tu veux faire, l'encodage de ton script et celui de tes données n'ont rien à voir ensemble. Exemple: Code :
Citation:
|
|||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() TALN:inférence grammaticale Inscription : avril 2010 Messages : 16 ![]() |
Merci pour ta réponse mais lorsque j'ai tenté de lire à partir de la page HTML en utf-16 avec la commande
htmlSource = urllib.urlopen(url).read().decode('utf-16') un message d'erreur est apparu Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> lancer() File "C:\Users\ESSMA\Desktop\getlien_khabar.py", line 328, in lancer base = get_Html("http://www.elkhabar.com/ar/") File "C:\Users\ESSMA\Desktop\getlien_khabar.py", line 216, in get_Html htmlSource = urllib.urlopen(url).read().decode('utf-16') File "C:\Python27\lib\encodings\utf_16.py", line 16, in decode return codecs.utf_16_decode(input, errors, True) UnicodeDecodeError: 'utf16' codec can't decode bytes in position 262-263: illegal UTF-16 surrogate |
|
|
00
|
|
|
#4 | |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 710 ![]() |
Citation:
__________________
Architectures Post-Modernes |
|
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() TALN:inférence grammaticale Inscription : avril 2010 Messages : 16 ![]() |
pour répondre a ta qst :
je veux construire une base de données de texte arabe j'ai extrait le contenu d'une page HTML avec decode(utf-8) et j'ai copié le text sur un fichier TXT avec un encode (utf-8) j'ai implémenté ceci avec succès mais la phase d'après, le logiciel avec le quel je veux utilisé ces fichier doivent etre txt codé en UTF-16 et utilise l'AnSi ce lodicizl est déja pret alors comment puis je refaire la meme chose en utf -16 Merci |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Inscription : octobre 2008 Messages : 942 ![]() |
Si tu l'as déjà fait avec succès, alors il suffit de refaire exactement la même chose en changeant uniquement la dernière étape. C'est-à-dire en enregistrant en utf-16.
Que le document original soit en utf-8 ne t'empêche pas de l'enregistrer dans un autre encodage. |
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() TALN:inférence grammaticale Inscription : avril 2010 Messages : 16 ![]() |
j'ai refai cette étape:
je lit en utf-8 apartir de la page web et j'enregistre en utf-16 aucune erreur n'est survenu dans mon programme mais dans mon fichier en sortie , j'ai mon text plus une séquence de caractères spéciaux , ex: 䘆 㜀ㄆ䄆 䄀ㄆ䘆㌆✆ 䄀䨆 䔀Ⰶ✆䐆 ✀䐆㌆䨆✆ⴆ⤆ 䄀䨆 ✀䐆Ⰶ䘆䠆⠆ఆ 䔀㜆✆䐆⠆⤆ ✀䐆ⴆ䌆䠆䔆⤆ ⠀✆䐆㘆㨆㜆 㤀䐆䤆 ✀䐆ㄆ☆䨆㌆ ✀䐆䄆ㄆ䘆㌆䨆 䄀ㄆ✆䘆㌆䠆✆ 䜀䠆䐆✆䘆⼆ఆ ⸀䐆✆䐆 ㈀䨆✆ㄆ⨆䜆 ✀䐆ㄆ㌆䔆䨆⤆ఆ 䐀䔆ㄆ✆Ⰶ㤆⤆ 䜀〆✆ ✀䐆⨆㔆 |
|
|
00
|
|
|
#8 | |||
|
Membre Expert
![]() ![]() Inscription : octobre 2008 Messages : 942 ![]() |
Ben oui mais je suppose que cela dépend du support d'affichage.
Un terminal ? un bloc-notes ? Moi si je reprend exactement ton texte de cette manière: Code :
Citation:
Èventuellement, donnes le lien de la page web d'où provient le texte. |
|||
|
|
00
|
|
|
#9 | ||||
|
Invité de passage
![]() TALN:inférence grammaticale Inscription : avril 2010 Messages : 16 ![]() |
je connais la source du problèmce qui me génère ces caractères spéciaux mais je ne sais comment le résoudre ,
o faite : j'ouvre un ficchier en append , j'ecrie mon texte + un saut de ligne , mais c'est cet saut de ligne en question qui me génère des prb j'ai esseyai de l'ecrire de plusieur facon mais sans succès Code :
objf.write((text+u'\n').encode('utf-16')) Code :
objf.write((text+'\n').encode('utf-16')) Code :
objf.write((text+unicode('\n','utf-8')).encode('utf-16')) Code :
Code :
Que puis je faire ??! |
||||
|
|
00
|
|
|
#10 | ||
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 777 ![]() |
Bonjour,
A mon avis, il faut utiliser le module codecs dans ce genre de cas. Le principe: 1 on lit un fichier en donnant l'encodage source: il est lu et chargé en mémoire en unicode. 2- on peut faire le traitement qu'on veut en mémoire puisque c'est de l'unicode. 3- on écrit le fichier en donnant l'encodage destination Si on veut seulement convertir un fichier 'utf-8' en 'utf-16', cela donnerait quelque chose comme: Code :
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
||
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 710 ![]() |
Salut,
Chaque appel a str.encode('utf-16') place le BOM fffe en tête du buffer. C'est ce BOM qui fout la grouille lorsqu'on écrit le fichier avec plusieurs .encode à la suite. La suggestion de Tyrtamos est une bonne idée. Mais après quelques tests, je n'arrive pas à la faire fonctionner: les appends ajoutent toujours le BOM avant d'écrire la suite. Et, je n'ai pas le temps de regarder plus. - W
__________________
Architectures Post-Modernes |
|
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 777 ![]() |
@wiztricks
J'ai déjà utilisé 'utf-8-sig' au lieu de 'utf-8' pour neutraliser le BOM du début de fichier (cf doc du module codecs).
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
|
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 710 ![]() |
Désolé, mais je ne vois pas en quoi cela aide dans le cas utf-16.
__________________
Architectures Post-Modernes |
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() TALN:inférence grammaticale Inscription : avril 2010 Messages : 16 ![]() |
navré de vous dire que rien ne marche
![]() il y'aurait pas une fonction équivalent a wirteln() qui ajoute automatiquement un saut de ligne a la fin du fichier merci |
|
|
00
|
|
|
#15 | |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 710 ![]() |
Citation:
- ré-écrire le fichier complètement et faire des ajouts après, - s/classer codec pour détecter le premier write et bazarder le BOM - W
__________________
Architectures Post-Modernes |
|
|
|
00
|
|
|
#16 | ||
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 777 ![]() |
J'avais mal compris, je pensais qu'on ne pouvait pas lire l'utf-8 avec le BOM. Et je viens de constater que l'écriture en utf-16 place son BOM "FF FE".
Il suffit dans ce cas de le recopier en binaire, en "oubliant" ses 2 premiers octets: Ce qui fait, à la suite de mon code précédent: Code :
PS: dans mon code précédent, il y a une petite coquille: "codecs" et non "codes"
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
||
|
|
00
|
|
|
#17 | |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 710 ![]() |
Citation:
Le soucis est lorsqu'on fait des appends à un fichier existant: çà ajoute le BOM lors du premier write. Il sera en plein milieu du fichier. - W
__________________
Architectures Post-Modernes |
|
|
|
00
|
|
|
#18 | ||||||||||
|
Expert Confirmé
![]() ![]() Inscription : décembre 2007 Messages : 1 777 ![]() |
Citation:
A défaut d'autre chose, j'exploiterais la solution que je viens de donner: 1- enregistrer le contenu qu'on veut ajouter, dans un fichier temporaire en texte utf-16, 2- et le recopier sous forme binaire à la fin de l'autre, en oubliant son BOM avec seek. Je viens d'essayer: ça marche. Voilà ce que j'ai fait: J'ai un fichier "source.txt" encodé en utf-8, et qui contient: Citation:
Code :
Code :
Code :
Code :
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos... Mes recettes python: http://www.jpvweb.com |
||||||||||
|
|
00
|
|
|
#19 | ||
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 710 ![]() |
Salut,
Après quelques recherches, ce problème est connu. Il est corrigé dans le module io mais pas dans codecs (pour les versions 2.7 et +). reproducteur. Code :
Si c'est le cas, oubliez codecs et passez par io. - W
__________________
Architectures Post-Modernes |
||
|
|
00
|
|
|
#20 |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 710 ![]() |
__________________
Architectures Post-Modernes |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com