本文实例讲述了Python实现将HTML转换成doc格式文件的方法。分享给大家供大家参考,具体如下:
网页上的一些文章,因为有格式的原因,它们在网页上的源码都是带有html标签的,用css来进行描述。本文利用HTML Parser 和docx两个模块,对网页进行解析并存储到word文档中。转换出来的格式相对还是有些粗糙,不喜勿喷。话不多说,直接上代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class HTMLClient:
#获取html网页源码
def GetPage( self , url):
#user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
user_agent = 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/34.0.1847.116 Chrome/34.0.1847.116 Safari/537.36'
headers = { 'User-Agent' : user_agent }
req = urllib.request.Request(url, None , headers)
try :
res = urllib.request.urlopen(req)
return res.read().decode( "utf-8" )
except urllib.error.HTTPError as e:
return None
#获取网络图片并保存在程序运行目录下
def GetPic( self , url):
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = urllib.request.Request(url, None , headers)
try :
res = urllib.request.urlopen(req)
return res.read()
except urllib.error.HTTPError as e:
return None
|
html到doc的转换过程中,图片保存和处理是比较麻烦的事情,因为可能涉及到图片格式错误,因此为了保证图片正常运行,应当修改图片添加异常处理流程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
class MYHTMLParser(HTMLParser):
def __init__( self , docfile):
HTMLParser.__init__( self )
self .docfile = docfile
self .doc = Document(docfile)
self .myclient = HTMLClient()
self .text = ''
self .title = False
self .isdescription = False
self .picList = []
#根据标签头类型决定标签内容的格式
def handle_starttag( self , tag, attrs):
#print "Encountered the beginning of a %s tag" % tag
self .title = False
self .isdescription = False
#<h1>标签说明其中的内容是标题
if re.match(r 'h(\d)' , tag):
self .title = True
#图片的处理比较复杂,首先需要找到对应的图片的url,然后下载并写入doc中
#下载的图片格式如果有问题,docx模块会报错,因此重新定义异常处理
#图片名称需要记录下来,在文档保存后要自动删除
if tag = = "img" :
if len (attrs) = = 0 : pass
else :
for (variable, value) in attrs:
if variable = = "src" :
#此处图片url类型为[http://url/pic.img!200*200]
#不同网站图片类型不同,因此当作不同处理
picdata = self .myclient.GetPic(value.split( '!' )[ 0 ])
if picdata = = None :
pass
else :
pictmp = value.split( '/' )[ - 1 ].split( '!' )[ 0 ]
picfix = value.split( '/' )[ - 1 ].split( '!' )[ - 1 ]
with open (pictmp, 'wb' ) as pic:
pic.write(bytes(picdata))
pic.close()
try :
if picfix[ 0 : 1 ] = = 'c' :
self .doc.add_picture(pictmp, width = Inches( 4.5 ))
else :
self .doc.add_picture(pictmp) #, width=Inches(2.25))
except docx.image.exceptions.UnexpectedEndOfFileError as e:
print (e)
self .picList.append(pictmp)
#javascript脚本
if tag = = 'script' :
self .isdescription = True
def handle_data( self , data):
if self .title = = True :
if self .text ! = '':
self .doc.add_paragraph( self .text)
self .text = ''
self .doc.add_heading(data, level = 2 )
if self .isdescription = = False :
self .text + = data
def handle_endtag( self , tag):
#if tag == 'br' or tag == 'p' or tag == 'div':
if self .text ! = '':
self .doc.add_paragraph( self .text)
self .text = ''
def complete( self , html):
self .feed(html)
self .doc.save( self .docfile)
for item in self .picList:
if os.path.exists(item):
os.remove(item)
|
希望本文所述对大家Python程序设计有所帮助。
原文链接:http://blog.csdn.net/tomshall/article/details/48594939