最新公告
  • 欢迎您光临SEO站长网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • Python爬取C语言中文网教程生成PDF

    修正代码,解决获取html/PDF无图片

    代码演示获取地址:http://c.biancheng.net/python/
    页面截图:

    生成PDF截图:

    [Python] 纯文本查看 复制代码
    01
    02
    03
    04
    05
    06
    07
    08
    09
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    import requests
    from lxml import etree
    import re
    import os
    import pdfkit
    def gethtml(url,encode):
        r = requests.get(url)
        r.encoding = encode
        return r.text
    def writehtml(path,str):
        f = open(path,'w+',encoding='utf-8')
        f.write(str)
        f.close
    def validateTitle(title):
        rstr = r"[\/\\\:\*\?\"\<\>\|]"
        new_title = re.sub(rstr, "_", title)
        return new_title
    def mkdir(path):
        path = path.strip()
        isExists = os.path.exists(path)
        if not isExists:
            os.makedirs(path)
            return True
        else:
            print('文件夹已存在,请检查后再试!')
            return False
    def getdata(url,pdf):
        print('开始获取,请稍候...')
        c_url = url.split('/')[0] + '//' + url.split('/')[2] + '/'
        html = gethtml(url,'utf-8')
        ehtml = etree.HTML(html)
        urll1 = ehtml.xpath('//*[@id="contents"]/dd/a/@href')
        till1 = ehtml.xpath('//*[@id="contents"]/dd/a/text()')
        s = ehtml.xpath('//*[@id="contents"]/dd/span/text()')
        folder=validateTitle(ehtml.xpath('//*[@id="contents"]/dt/a/text()')[0])
        if mkdir(savepath+folder):
            m = 0
            txt=''
            for i in urll1:
                html = gethtml(c_url + i,'utf-8')
                ehtml = etree.HTML(html)
                strs = ehtml.xpath('//*[@id="article"]')[-1]
                txtl1 = etree.tostring(strs, encoding="utf-8", pretty_print=True, method="html").decode("utf-8")
                fname = validateTitle(s[m] + ' ' + till1[m])
                txtl1 = re.sub('<h1>.*?</h1>','<h1>'+fname+'</h1>',txtl1)
                txtl1 = re.sub('src="/','src="'+c_url+'/',txtl1)
                txt=txt+txtl1
                #writehtml(savepath+folder+'\\'+fname+'.html', txtl1)  #每个章节生成一个html文件
                s1 = ehtml.xpath('//*[@id="contents"]/dl/dd/text()')
                s2 = ehtml.xpath('//*[@id="contents"]/dl/dd/a/text()')
                urll2=ehtml.xpath('//*[@id="contents"]/dl/dd/a/@href')
                print(fname)
                n=0
                for j in urll2:
                    html=gethtml(c_url+j,'utf-8')
                    ehtml = etree.HTML(html)
                    strs = ehtml.xpath('//*[@id="arc-body"]')[-1]
                    txtl2 = etree.tostring(strs, encoding="utf-8", pretty_print=True, method="html").decode("utf-8")
                    fname = validateTitle(s1[n]+' '+s2[n])
                    txtl2= re.sub('<h[2,4]>','<h3>',txtl2)
                    txtl2 = re.sub('</h[2,4]>', '</h3>', txtl2)
                    txtl2 = re.sub('src="/','src="'+c_url+'/',txtl2)
                    txtl2 = '<h2>' + fname + '</h2>'+txtl2
                    txt = txt + txtl2
                    #writehtml(savepath+folder+'\\'+fname + '.html', txtl2) #每个章节生成一个html文件
                    print(fname)
                    n+=1
                m+=1
            writehtml(savepath+folder+'\\'+folder + '.html’,txt)
            if pdf:
                print('开始生成pdf,请稍候...')
                path_wk = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'  # wkhtmltopdf安装位置
                config = pdfkit.configuration(wkhtmltopdf=path_wk)
                options = {
                    'page-size': 'A4',
                    'margin-top': '0.75in',
                    'margin-right': '0.75in',
                    'margin-bottom': '0.75in',
                    'margin-left': '0.75in',
                    'encoding': "UTF-8",
                    'outline': None
                }
                pdfkit.from_file([savepath+folder+'\\'+folder + '.html'], savepath+folder+'\\'+folder+'.pdf’,options=options,configuration=config)
            print('任务完成!')
    if __name__ == '__main__':
        url = 'http://c.biancheng.net/python/' #获取教程url地址
        savepath='C:\\'   #保存位置
        getdata(url,True) #后面True表示生成PDF,False不生成

    说明:
    代码中两处writehtml注释后仅生成一个html和一个Pdf文件

    取消注释的话,每个章节将会生成一个html文件,如下:

    另外,生成PDF使用了pdfkit库,关于这个库要说明一下,PIP安装后直接使用还是会报错的,还需要下载安装windows版本的wkhtmltopdf
    下载地址:https://downloads.wkhtmltopdf.or … .msvc2015-win64.exe
    安装完成之后需要在代码中修改path_wk wkhtmltopdf.exe的安装路径,然后可以了

    image.png (357.83 KB, 下载次数: 3)

    image.png
    1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!36673262@qq.com
    2. 本站所提供下载的资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理,有奖励!
    3. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有学币奖励和额外收入!

    SEO站长网 » Python爬取C语言中文网教程生成PDF

    发表评论

    你的前景,远超我们想象

    选择学么=选择高薪,选择=成功

    • 原创课程

      课程独家原创

    • 零基础

      人人都能轻松入门

    • 注重实战

      轻理论重实战讲实效

    • 高品质

      一对一在线答疑

    • 用心服务

      解除后顾之忧

    • 手机学习

      随时随地轻松学习