文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何用python抓取网站教程并制作成PDF文档

2023-06-04 14:31

关注

这篇文章主要介绍“如何用python抓取网站教程并制作成PDF文档”,在日常操作中,相信很多人在如何用python抓取网站教程并制作成PDF文档问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用python抓取网站教程并制作成PDF文档”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

实现功能:抓取廖雪峰网站的python教程,保存html页面到本地,然后用pdfkit包将html转换为pdf。
运行需求:安装python的pdfkit包和windows下的wkhtmltopdf。

代码如下:
# -*- coding: utf-8
import urllib2
import urllib
import re,os
import time
import pdfkit
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

class Liao:
    def __init__(self,init_url,out_put_path):
        self.init_url = init_url
        self.out_put_path = out_put_path
        self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        self.headers = { 'User-Agent' : self.user_agent }
        self.file_name = 'liao.pdf'
        self.html_template = """
                            <!DOCTYPE html>
                            <html lang="en">
                            <head>
                                <meta charset="gb2312">
                            </head>
                            <body>
                            {content}
                            </body>
                            </html>

    #获取网页内容
    def get_content(self,url):
        try:
            request = urllib2.Request(url,headers=self.headers)
            response = urllib2.urlopen(request)
            content = response.read().decode('utf-8').encode('GBK')
            return content
        except urllib2.URLError, e:
            if hasattr(e,"reason"):
                print u"连接页面失败,错误原因",e.reason
                return None

    #获取文章目录url列表
    def get_article_url(self):
        content = self.get_content(self.init_url)
        #print content
        pattern = re.compile(r'<li id="\d.*?" >.*?<a href="(.*?)">(.*?)</a>.*?</li>',re.S)
        # pattern = re.compile(r'<li id="(\d.*?)" >',re.S)
        result = re.findall(pattern,content)
        i = 1
        print len(result)
        # for x in result:
        #     print x[0],x[1]
        #     i+=1
        return result

    #获取文章内容,传入文章的url,返回文章内容
    def get_article_detail(self):
        url_list = self.get_article_url()
        pattern = re.compile(r'<div class="x-wiki-content">(.*?)</div>',re.S)
        # patt_title = re.compile(r'<h5>(.*?)</h5>')
        patt_img = re.compile(r'<img src="(/files/attachments/.*?)"',re.S)
        i = 1
        urls = []
        for item in url_list:
            #获取文章的url
            article_url = 'http://www.liaoxuefeng.com' + item[1]
            url_ind = article_url.split('/')[-1]

            #提取文章标题
            article_title = item[2].replace('/','_')
            title_level = item[0]
            #title_tag = '<center><h' + title_level + '>' + article_title + '</h' + title_level + '></center>'
            title_tag = '<center><h2>' + article_title + '</h></center>'
            #生成html文件名
            html_file = url_ind + '.html'

            #根据文章url,抓取文章内容
            content = self.get_content(article_url)
            article_content = str(re.findall(pattern,content)[0])

            #处理图片的url,加上域名
            def func(m):
                if not m.group(1).startswith("http"):
                    rtn = '<img src="http://www.liaoxuefeng.com' + m.group(1) + '"'
                    return rtn
                else:
                    return '<img src="' + m.group(1) + '"'
            article_content = re.compile(patt_img).sub(func, article_content)

            #将标题加到文章内容中
            article_content = title_tag + article_content
            article_content = self.html_template.format(content=article_content)

            #生成url及文件名列表
            urls.append((url_ind,html_file))

            #写文件
            print 'saving file ' + html_file
            with open(html_file, 'wb') as f:
                f.write(article_content)
        return urls

    #将html保存成pdf
    def save_pdf(self,htmls):
        """
        把所有html文件保存到pdf文件
        """
        options = {
                'page-size': 'Letter',
                'encoding': "UTF-8",
                'custom-header': [
                    ('Accept-Encoding', 'gzip')
                ]
            }
        pdfkit.from_file(htmls, self.file_name, options=options)

init_url = 'http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000'
out_put_path = 'd:/python/test/output'
liao = Liao(init_url,out_put_path)
urls = liao.get_article_detail()
htmls = [x[1] for x in urls]
liao.save_pdf(htmls)

到此,关于“如何用python抓取网站教程并制作成PDF文档”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯