In diesem Artikel wird hauptsächlich die Methode von Python zum Erfassen von HTML-Webseiten und zum Speichern dieser in Form von PDF-Dateien vorgestellt. Er analysiert die Installation des PyPDF2-Moduls und die damit verbundenen Betriebstechniken von Python zum Erfassen von HTML-Seiten und zum Generieren von PDF-Dateien Auf das PyPDF2-Modul in Form von Beispielen können sich Freunde, die es benötigen, beziehen
Dieser Artikel beschreibt, wie Python HTML-Webseiten erfassen und als PDF-Dateien speichern kann. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
1. Einführung
Heute werde ich vorstellen, wie man HTML-Web erfasst Seiten herunterladen und als PDF speichern, ohne weitere Umschweife direkt zum Tutorial zu gelangen.
2. Vorbereitung
1. Installation und Verwendung von PyPDF2 (zum Zusammenführen von PDF):
PyPDF2-Version: 1.25.1
Installation:
pip install PyPDF2
Verwendungsbeispiel:
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. Anfragen und Beautifulsoup sind zwei Hauptartefakte von Crawlern, Reuqests wird für Netzwerkanfragen verwendet und Beautifulsoup wird zum Betreiben von HTML-Daten verwendet. Mit diesen beiden Shuttles können Sie schnell arbeiten. Wir brauchen keine Crawler-Frameworks wie Scrapy, es mit einem so kleinen Programm zu verwenden, ist etwas übertrieben. Da Sie außerdem HTML-Dateien in PDF konvertieren, müssen Sie auch über entsprechende Bibliotheksunterstützung verfügen. wkhtmltopdf ist ein sehr nützliches Tool, das HTML für mehrere Plattformen in PDF konvertieren kann. Installieren Sie zunächst die folgenden Abhängigkeitspakete
pip install requests pip install beautifulsoup4 pip install pdfkit
3. Installieren Sie wkhtmltopdf
Windows-Plattform direkt unter http://wkhtmltopdf .org/downloads.html Laden Sie die stabile Version von wkhtmltopdf herunter und installieren Sie sie. Fügen Sie nach Abschluss der Installation den Ausführungspfad des Programms zur Systemumgebungsvariablen $PATH hinzu und es erscheint die Fehlermeldung „Keine wkhtmltopdf ausführbare Datei“. gefunden“ erscheint. Ubuntu und CentOS können direkt über die Befehlszeile installiert werden
$ sudo apt-get install wkhtmltopdf # ubuntu $ sudo yum intsall wkhtmltopdf # centos
3. Datenvorbereitung
1. Holen Sie sich die URL jedes Artikels
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. Speichern Sie den HTML-Code jedes Artikels durch die Artikel-URL-Datei
HTML-Vorlage:
html_template = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> {content} </body> </html> """
Speichern:
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. HTML in PDF konvertieren
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. Die konvertierten einzelnen PDFs zu einem PDF zusammenführen
merger = PdfFileMerger() for pdf in pdfs: merger.append(open(pdf,'rb')) print u"合并完成第"+str(i)+'个pdf'+pdf
Vollständiger Quellcode:
# 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()
Verwandte Empfehlungen:
Python implementiert die einfache Crawler-Freigabe, um Links auf der Seite zu erfassen
Python implementiert das Crawlen von Website-Titelinformationen der Baidu-Suchergebnisseite
Das obige ist der detaillierte Inhalt vonPython implementiert eine Methode zum Erfassen von HTML-Webseiten und zum Speichern dieser als PDF-Dateien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!