首页 编程教程正文

Python爬取C语言中文网教程生成PDF

piaodoo 编程教程 2020-02-22 22:15:08 1213 0 python教程

本文来源吾爱破解论坛

本帖最后由 null119 于 2019-7-16 04:19 编辑

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

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

0.png (248.02 KB, 下载次数: 2)

下载附件  保存到相册

2019-7-15 14:43 上传



生成PDF截图:

2.png (394.66 KB, 下载次数: 3)

下载附件  保存到相册

2019-7-15 14:44 上传



[Python] 纯文本查看 复制代码
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文件

4.png (20.84 KB, 下载次数: 0)

下载附件  保存到相册

2019-7-15 14:45 上传



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

3.png (151.39 KB, 下载次数: 0)

下载附件  保存到相册

2019-7-15 14:45 上传



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

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

下载附件  保存到相册

2019-7-16 04:15 上传

image.png

本帖被以下淘专辑推荐: · 吾爱收集|主题: 318, 订阅: 98

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7968.html

搜索