Форум сайта python.su
Привет, всем питоноводам!
Я хочу конвертировать несколько интернет страниц в один файл формата .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
Уважаемые коллеги, подскажите пожалуйста как решить данный вопрос?
Офлайн
Очень желательно включать полный код в пост. и/или пользоваться замечательным тегом , ибо по этим кусочкам сложно понять что происходит.
Но из того что я вижу… уберите дублирование тегов <html> <body> <head>. (Страницы в файле сохранены все, но отображается только первый блок <html>…</html>, что логично)
ЗЫ: И я думаю не стоит смену расширения файла называть конвертированием.
Офлайн
А где, собственно, конвертер о котором заявлено в заголовке? Это больше похоже на непонтяных-файлов-в-ворде-открыватель. :)
Из большого количества букв, вобщем-то, не очень понятно, что вам нужно. Текст? Текст со стилями? Изображения тоже нужны? Хотите ли вы на выходе получить человеческий документ или любой сойдет?
Если хотите нормальный документ, то самостоятельно парсите html, а потом создаете документ при помощи python-docx, т.е. действительно пишите конвертер.
Если внешний вид документа не важен, то можно пользоваться все теми же хаками.
Начать нужно, хотя бы, с прочтения ошибки, которую вам выдал word:
WordИз этого понятно, что запихивать ваш html в ворд напрямую нельзя, т.е. нужно искать причину из-за которой ворд считает его поврежденным.
Приложению не удалось прочитать документ. Возможно, он поврежден.Попробуйте выполнить следующие действия:* Откройте файл с помощью команды ‘'Открыть и восстановить’'.* Откройте файл с помощью конвертера резервных копий.
Отредактировано (Март 19, 2011 02:03:47)
Офлайн
Похожим методом писал конвертер. Работает так: открывает в 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() Ñîõðàíÿåò êàê docx
converter.SaveAs( outputFile )
print "saved..."
converter.Quit()
def main():
if len( sys.argv ) < 3:
print "Ìàëî ïàðàìåòðîâ"
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()
Офлайн
Ребят, всем большое спасибо! Дали много пищи для ума. Будем экспериментировать…
Офлайн