Найти - Пользователи
Полная версия: Пишу конвертер html в doc(docx,rtf) требуется help!
Начало » Центр помощи » Пишу конвертер html в doc(docx,rtf) требуется help!
1
Илья!_!_!
Привет, всем питоноводам!
Я хочу конвертировать несколько интернет страниц в один файл формата .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

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

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

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

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

Кстати, если уж пользоваться хаками, то я бы попробовал сделать так:
- Создать mht вот этим http://www.chilkatsoft.com/python.asp (не пробовал, но, думаю, должно получиться)
- Пересохранить его в ворде используя COM
lavrton
Похожим методом писал конвертер. Работает так: открывает в 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()
Илья!_!_!
Ребят, всем большое спасибо! Дали много пищи для ума. Будем экспериментировать…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB