Web 自动化下载及转换 Word 的应用,主要涉及到爬虫技术的应用和 docx 的应用。通过爬虫的应用,能快速把你想搜集的内容以及图片,视频等下载,利用 docx实现对Word的自动排版等功能。假如一个web里,包括几十,甚至上百段的文字和图片,如果我们通过人手去复制文字到word,然后还要把图片逐个保存在自己的电脑,然后再在word逐个导入,到最后还要花大量的时间去排版,又或者我们只需要其中的部分内容,要慢慢去找到相关的内容,这是多么费劲,而且还有出错的可能性。
因此通过爬虫结合docx就可以实现秒完成加载保存。
以 图1,图2为例,在Web中,有 text 和 图片并存。
1. 怎样获取正文html内容? 创建一个 split_text_by_img()函数,params分别为 html 和 imglist, 作用就是以图片为分割参照物,最后返回每段正文内容的html,具体代码如下:
def split_text_by_img(html,imglist):
content_parts = []
for imgtag in imglist:
html = str(html) # 把html转换成str,为split做铺垫
str_tmp = html.split(str(imgtag))[0] # 提取图片前的正文内容的html,添加到 content_parts 这个 lst 里
content_parts.append(str_tmp)
html = html.replace((str_tmp + str(imgtag)),'') # 把上一个的正文和图片删除,把最新的html成为下一个循环遍历的html
content_parts.append(html) # 如果最后一个图片后还有正文内容,需要把最后置换剩下的html加回到content_parts lst里
return content_parts # 返回 N 或者 (N+1) 个元素(正文内容的html) 的 lst
2. 怎样获取图片?创建一个pic的函数,params 分别为 feferer_url 和 pic_url, 其中referer的作用是,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。headers具体结构,如图3,具体代码如下:
def pic(referer_url,pic_url):
headers = { "Accept":"text/html,application/xhtml+xml,application/xml;",
"Accept-Encoding":"gzip,deflate",
"Accept-Language":"zh-CN,zh;q=0.9",
"Referer":referer_url,
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"
}
img_name = pic_url.split('/')[-1]+'.jpg' # 把图片链接分割,取反向索引-1 为文件名
with open(img_name,'wb')as f:
response = requests.get(pic_url,headers=headers).content
f.write(response)
return img_name #把图片链接写入二进制文件并保存为图片
3. 对指定 url 解析后,获取 title标签、整段正文的标签,以及所有图片的标签 lst, 代码如下:
url = 'xxxx ' # 填写实际的url
html = requests.get(url).content
soup = BeautifulSoup(html,'html.parser') # 解析html
title = soup.title.string #取得title标签的文字内容
post_detial = soup.find('div',id='sina_keyword_ad_area2') # 获取整个正文的段落标签,如图4
img_tag_list = post_detial.select('a>img ') #获取所有图片img的标签list
4. 调用 split_text_by_img函数
5. 通过循环,调用2个主函数去实现word的自动添加正文和图片,并自动排版,保存。
new_text = split_text_by_img(post_detial,img_tag_list)
document = Document() # 创建文档对象
document.add_heading(title) # 添加标题
i = 0 # 设循环初始值为0
for part in new_text:
part='<html><body><div>' + part # part是含html标签的字符串,调用BeautifuSoup时需要lxml格式化,需要加前缀,否则处理的时候会把第二部分开始的内容处理为空
part_tag = BeautifulSoup(part,'lxml')
document.add_paragraph(part_tag.get_text()) # 调用document.add_paragraph()方法,向文档里添加文字
if (i < len(img_tag_list)):
imgurl = img_tag_list[i].get('real_src') # 提取图片属性值,如图5
img_name = pic('http://blog.sina.com.cn',imgurl) # 调用pic()函数
document.add_picture(img_name) # 调用document.add_picture()方法,向文档里添加图片
i=i+1
document.save(title+'.doc') # 保存为标题命名的word file
图1
图2
图3
图4
图5