Уведомления

Группа в Telegram: @pythonsu

#1 Март 18, 2011 23:21:20

Илья!_!_!
От:
Зарегистрирован: 2011-03-18
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Пишу конвертер html в doc(docx,rtf) требуется help!

Привет, всем питоноводам!
Я хочу конвертировать несколько интернет страниц в один файл формата .doc
При записи:
f = urlopen('URL','r') #в программе на этом месте стоит цикл, страницы с сайта перебираются друг за другом и записываются в s

s=f.read()

c=open('d:/example.doc','a') #считанные из инета страницы должны поочередно записываться в файл example.doc

Фактически происходит следующее: создается файл, в него копируются данные(его размер увеличивается в процессе работы программы), но при открытии отображается только первая из считываемых страниц(после конвертирования некоторых страниц при открытии док-та вылазит еще и сообщение об отсутствующих css).

При этом, когда я сохраняю данные в формате .htm т.е. c=open('d:/example.htm','a'), все работает, т.е. создаётся один файл, в котором сохранены все закачанные и-нет страницы.
Пробовал конвертировать эту .htm книгу в .doc - такой же результат как и в начале.
Некоторые страницы удалось конвертировать создав сначала файл вормата .txt, а потом переведя его в .doc
f=open('d:/example.txt','r')
r=f.read()
h=open('d:/example.doc','a')
h.write(r)
Но такое получается не со всеми страницами и я понимаю, что это не верный путь.

Возможно есть какой-то работающий плагин. Например pywin32. На одном из форумов я нашел такой пример:

import win32com.client

word = win32com.client.Dispatch('Word.Application')

doc = word.Documents.Add('d:/example.html')

doc.SaveAs('d:/example.doc', FileFormat=0)

doc.Close()

word.Quit()

Пробую, пишет ошибку:

( doc = word.Documents.Add('example.html')File “<COMObject <unknown>>”, line 3, in Add pywintypes.com_error: (-2147352567, ‘\xce\xf8\xe8\xe1\xea\xe0.’, (0, u'Microsoft Word', u“\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e Word \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u043d \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d.\n\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n* \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u0444\u0430\u0439\u043b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b ‘'\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c’'.\n* \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u0444\u0430\u0439\u043b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439.”, u'C:\\Program Files\\Microsoft Office\\Office12\\1049\\WDMAIN11.CHM', 24631, -2146823137), None)

Пробовал писать по другому:

import sys, time
import threading
import pythoncom
from win32com.client import Dispatch
word = win32com.client.Dispatch('Word.Application')
doc = word.Documents.Add('d:/example.html')
doc.SaveAs('d:/example.doc', FileFormat=0)
doc.Close()
word.Quit()

Тот же результат.

У меня следующее ПО: Ms Win, python2.7, pywin32-214

Уважаемые коллеги, подскажите пожалуйста как решить данный вопрос?



Офлайн

#2 Март 19, 2011 02:01:42

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Пишу конвертер html в doc(docx,rtf) требуется help!

Очень желательно включать полный код в пост. и/или пользоваться замечательным тегом , ибо по этим кусочкам сложно понять что происходит.
Но из того что я вижу… уберите дублирование тегов <html> <body> <head>. (Страницы в файле сохранены все, но отображается только первый блок <html>…</html>, что логично)

ЗЫ: И я думаю не стоит смену расширения файла называть конвертированием.



Офлайн

#3 Март 19, 2011 02:02:41

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Пишу конвертер html в doc(docx,rtf) требуется help!

А где, собственно, конвертер о котором заявлено в заголовке? Это больше похоже на непонтяных-файлов-в-ворде-открыватель. :)
Из большого количества букв, вобщем-то, не очень понятно, что вам нужно. Текст? Текст со стилями? Изображения тоже нужны? Хотите ли вы на выходе получить человеческий документ или любой сойдет?

Если хотите нормальный документ, то самостоятельно парсите html, а потом создаете документ при помощи python-docx, т.е. действительно пишите конвертер.

Если внешний вид документа не важен, то можно пользоваться все теми же хаками.
Начать нужно, хотя бы, с прочтения ошибки, которую вам выдал word:

Word
Приложению не удалось прочитать документ. Возможно, он поврежден.Попробуйте выполнить следующие действия:* Откройте файл с помощью команды ‘'Открыть и восстановить’'.* Откройте файл с помощью конвертера резервных копий.
Из этого понятно, что запихивать ваш html в ворд напрямую нельзя, т.е. нужно искать причину из-за которой ворд считает его поврежденным.

Кстати, если уж пользоваться хаками, то я бы попробовал сделать так:
- Создать mht вот этим http://www.chilkatsoft.com/python.asp (не пробовал, но, думаю, должно получиться)
- Пересохранить его в ворде используя COM



Отредактировано (Март 19, 2011 02:03:47)

Офлайн

#4 Март 19, 2011 04:10:56

lavrton
От:
Зарегистрирован: 2010-11-13
Сообщения: 35
Репутация: +  1  -
Профиль   Адрес электронной почты  

Пишу конвертер html в doc(docx,rtf) требуется help!

Похожим методом писал конвертер. Работает так: открывает в Word'e html страницу и сохраняет её как doc. (с картинками). Приведу код, может пригодится.

# -*- coding: utf-8 -*-

import sys

from win32com.client.dynamic import Dispatch

import os

from shutil import copyfile

fsock = open( os.path.dirname( sys.argv[0] ) + '\converter.log', 'w' )

sys.stdout = fsock



class ConverterClass():

def __init__( self ):

self.wrd = Dispatch( 'Word.Application' )

self.doc = None

if self.wrd.Documents.Count > 0:

self.isWordOpen = 1

else:

self.isWordOpen = 0

self.wrd.Visible = 0



def Open( self, file_name ):

print file_name

# file_name = file_name.replace( '\\\\', '\\' )

# file_name = file_name.replace( '\\', '\\\\' )

self.doc = self.wrd.Documents.Open( file_name )

if self.doc == None:

file_name = file_name.replace( '\\', '\\\\' )

else:

return

print file_name

self.doc = self.wrd.Documents.Open( file_name )

if self.doc == None:

print( u'opening Word error' )

self.Quit()

sys.exit( 1 )



def TransformImages( self ):

try:

for i in xrange( self.doc.InlineShapes.Count ):

try:

self.doc.InlineShapes[i].LinkFormat.SavePictureWithDocument = True

except:

pass

except:

pass

def TransformContent( self ):

try:

self.doc.Convert()

except:

pass



def SaveAs( self, file_name ):

try:

self.doc.SaveAs( file_name, FileFormat = 0 )

except:

print sys.exc_info()

self.Quit()

sys.exit( 1 )



def Save( self ):

try:

self.doc.Save()

except:

print sys.exc_info()

#raw_input("Can't save file")

self.Quit()

sys.exit( 1 )



def Quit( self ):

if self.isWordOpen:

self.doc.Close()

else:

print ( 'quiting' )

self.doc.Close()

self.wrd.Quit()



def isValid( inputFile, outputFile ):

if not os.path.exists( inputFile ):

print "no input file"

return False

if len( os.path.basename( outputFile ) ) < 5:

print "bad output file"

return False

if not os.path.exists( os.path.dirname( outputFile ) ):

os.mkdir( os.path.dirname( outputFile ) )

print "made new dir"

return True



def ConvertFile( inputFile, outputFile ):

converter = ConverterClass()

converter.Open( inputFile )

print "opened..."

converter.TransformImages()

print "transformed..."

converter.SaveAs( outputFile )

converter.TransformContent()

#converter.Save() &#209;&#238;&#245;&#240;&#224;&#237;&#255;&#229;&#242; &#234;&#224;&#234; docx

converter.SaveAs( outputFile )

print "saved..."

converter.Quit()



def main():

if len( sys.argv ) < 3:

print "&#204;&#224;&#235;&#238; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#238;&#226;"

exit( 1 )



inputFile = sys.argv[1]

print "input file", inputFile

outputFile = sys.argv[2]

print "output file", outputFile



if not isValid( inputFile, outputFile ):

exit( 1 )

if outputFile[-4:] == 'html' or outputFile[-3:] == 'htm':

copyfile( inputFile, outputFile )

print "Done!"

return 0

ConvertFile( inputFile, outputFile )

print "Done!"

return 0



if __name__ == '__main__':

main()



Офлайн

#5 Март 19, 2011 19:11:31

Илья!_!_!
От:
Зарегистрирован: 2011-03-18
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Пишу конвертер html в doc(docx,rtf) требуется help!

Ребят, всем большое спасибо! Дали много пищи для ума. Будем экспериментировать…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version