Maison >développement back-end >Tutoriel Python >Python implémente une méthode pour capturer des pages Web HTML et les enregistrer sous forme de fichiers PDF
Cet article présente principalement la méthode de Python pour capturer des pages Web HTML et les enregistrer sous forme de fichiers PDF. Il analyse l'installation du module PyPDF2 et les techniques d'exploitation associées de Python pour capturer des pages HTML et générer des fichiers PDF basés sur. sur le module PyPDF2 sous forme d'exemples. , Les amis dans le besoin peuvent se référer à
Cet article décrit comment Python peut capturer des pages Web HTML et les enregistrer sous forme de fichiers PDF. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
1 Introduction
Aujourd'hui, je vais vous présenter comment capturer du Web HTML. pages et enregistrez-les au format PDF, sans plus tarder, accédez directement au tutoriel.
2. Préparation
1. Installation et utilisation de PyPDF2 (utilisé pour fusionner des PDF) :
Version PyPDF2 : 1.25.1
Installation :
pip install PyPDF2
Exemple d'utilisation :
from PyPDF2 import PdfFileMerger merger = PdfFileMerger() input1 = open("hql_1_20.pdf", "rb") input2 = open("hql_21_40.pdf", "rb") merger.append(input1) merger.append(input2) # Write to an output PDF document output = open("hql_all.pdf", "wb") merger.write(output)
2. request et beautifulsoup sont deux artefacts majeurs des robots d'exploration, les reuqests sont utilisés pour les requêtes réseau et beautifulsoup est utilisé pour exploiter les données HTML. Avec ces deux navettes, vous pouvez travailler rapidement. Nous n’avons pas besoin de frameworks d’exploration comme Scrapy. L’utiliser sur un si petit programme est un peu excessif. De plus, puisque vous convertissez des fichiers HTML en PDF, vous devez également disposer du support de bibliothèque correspondant. wkhtmltopdf est un outil très utile qui peut convertir du HTML en PDF adapté à plusieurs plates-formes. pdfkit est le package Python de wkhtmltopdf. Installez d'abord les packages de dépendances suivants
pip install requests pip install beautifulsoup4 pip install pdfkit
3 Installez wkhtmltopdf
Plateforme Windows directement sur http : /. /wkhtmltopdf.org/downloads.html Téléchargez la version stable de wkhtmltopdf et installez-la. Une fois l'installation terminée, ajoutez le chemin d'exécution du programme à la variable $PATH de l'environnement système. Sinon, pdfkit ne trouve pas wkhtmltopdf et l'erreur "Non". "Exécutable wkhtmltopdf trouvé" apparaîtra. . Ubuntu et CentOS peuvent être installés directement à l'aide de la ligne de commande
$ sudo apt-get install wkhtmltopdf # ubuntu $ sudo yum intsall wkhtmltopdf # centos
Préparation des données
1. Obtenez l'url de chaque article
def get_url_list(): """ 获取所有URL目录列表 :return: """ response = requests.get("http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000") soup = BeautifulSoup(response.content, "html.parser") menu_tag = soup.find_all(class_="uk-nav uk-nav-side")[1] urls = [] for li in menu_tag.find_all("li"): url = "http://www.liaoxuefeng.com" + li.a.get('href') urls.append(url) return urls
2. Enregistrez l'url de chaque article avec un. modèle fichier HTML de l'article
modèle html :html_template = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> {content} </body> </html> """Enregistrer :
def parse_url_to_html(url, name): """ 解析URL,返回HTML内容 :param url:解析的url :param name: 保存的html文件名 :return: html """ try: response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 正文 body = soup.find_all(class_="x-wiki-content")[0] # 标题 title = soup.find('h4').get_text() # 标题加入到正文的最前面,居中显示 center_tag = soup.new_tag("center") title_tag = soup.new_tag('h1') title_tag.string = title center_tag.insert(1, title_tag) body.insert(1, center_tag) html = str(body) # body中的img标签的src相对路径的改成绝对路径 pattern = "(<img .*?src=\")(.*?)(\")" def func(m): if not m.group(3).startswith("http"): rtn = m.group(1) + "http://www.liaoxuefeng.com" + m.group(2) + m.group(3) return rtn else: return m.group(1)+m.group(2)+m.group(3) html = re.compile(pattern).sub(func, html) html = html_template.format(content=html) html = html.encode("utf-8") with open(name, 'wb') as f: f.write(html) return name except Exception as e: logging.error("解析错误", exc_info=True)
3. Convertir le HTML en PDF
def save_pdf(htmls, file_name): """ 把所有html文件保存到pdf文件 :param htmls: html文件列表 :param file_name: pdf文件名 :return: """ options = { 'page-size': 'Letter', 'margin-top': '0.75in', 'margin-right': '0.75in', 'margin-bottom': '0.75in', 'margin-left': '0.75in', 'encoding': "UTF-8", 'custom-header': [ ('Accept-Encoding', 'gzip') ], 'cookie': [ ('cookie-name1', 'cookie-value1'), ('cookie-name2', 'cookie-value2'), ], 'outline-depth': 10, } pdfkit.from_file(htmls, file_name, options=options)
4 . les PDF uniques convertis en un seul PDF
merger = PdfFileMerger() for pdf in pdfs: merger.append(open(pdf,'rb')) print u"合并完成第"+str(i)+'个pdf'+pdf
Code source complet :
# coding=utf-8 import os import re import time import logging import pdfkit import requests from bs4 import BeautifulSoup from PyPDF2 import PdfFileMerger html_template = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> {content} </body> </html> """ def parse_url_to_html(url, name): """ 解析URL,返回HTML内容 :param url:解析的url :param name: 保存的html文件名 :return: html """ try: response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 正文 body = soup.find_all(class_="x-wiki-content")[0] # 标题 title = soup.find('h4').get_text() # 标题加入到正文的最前面,居中显示 center_tag = soup.new_tag("center") title_tag = soup.new_tag('h1') title_tag.string = title center_tag.insert(1, title_tag) body.insert(1, center_tag) html = str(body) # body中的img标签的src相对路径的改成绝对路径 pattern = "(<img .*?src=\")(.*?)(\")" def func(m): if not m.group(3).startswith("http"): rtn = m.group(1) + "http://www.liaoxuefeng.com" + m.group(2) + m.group(3) return rtn else: return m.group(1)+m.group(2)+m.group(3) html = re.compile(pattern).sub(func, html) html = html_template.format(content=html) html = html.encode("utf-8") with open(name, 'wb') as f: f.write(html) return name except Exception as e: logging.error("解析错误", exc_info=True) def get_url_list(): """ 获取所有URL目录列表 :return: """ response = requests.get("http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000") soup = BeautifulSoup(response.content, "html.parser") menu_tag = soup.find_all(class_="uk-nav uk-nav-side")[1] urls = [] for li in menu_tag.find_all("li"): url = "http://www.liaoxuefeng.com" + li.a.get('href') urls.append(url) return urls def save_pdf(htmls, file_name): """ 把所有html文件保存到pdf文件 :param htmls: html文件列表 :param file_name: pdf文件名 :return: """ options = { 'page-size': 'Letter', 'margin-top': '0.75in', 'margin-right': '0.75in', 'margin-bottom': '0.75in', 'margin-left': '0.75in', 'encoding': "UTF-8", 'custom-header': [ ('Accept-Encoding', 'gzip') ], 'cookie': [ ('cookie-name1', 'cookie-value1'), ('cookie-name2', 'cookie-value2'), ], 'outline-depth': 10, } pdfkit.from_file(htmls, file_name, options=options) def main(): start = time.time() file_name = u"liaoxuefeng_Python3_tutorial" urls = get_url_list() for index, url in enumerate(urls): parse_url_to_html(url, str(index) + ".html") htmls =[] pdfs =[] for i in range(0,124): htmls.append(str(i)+'.html') pdfs.append(file_name+str(i)+'.pdf') save_pdf(str(i)+'.html', file_name+str(i)+'.pdf') print u"转换完成第"+str(i)+'个html' merger = PdfFileMerger() for pdf in pdfs: merger.append(open(pdf,'rb')) print u"合并完成第"+str(i)+'个pdf'+pdf output = open(u"廖雪峰Python_all.pdf", "wb") merger.write(output) print u"输出PDF成功!" for html in htmls: os.remove(html) print u"删除临时文件"+html for pdf in pdfs: os.remove(pdf) print u"删除临时文件"+pdf total_time = time.time() - start print(u"总共耗时:%f 秒" % total_time) if __name__ == '__main__': main()Recommandations associées :
Python implémente un partage simple de robot pour explorer les liens sur la page
Python implémente la saisie les informations sur le titre du site Web de la page des résultats de recherche Baidu
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!