你有没有遇到过这种场景。看到一个不错的网页教程,想保存下来慢慢看。复制粘贴太慢,截图又不清晰。用浏览器自带的打印功能,排版经常乱掉。
我今天就跟你聊聊,怎么用Python把网页转成PDF。我试过3种方法,踩了不少坑,现在把经验分享给你。
第一种方法,用pdfkit。这个库包装了wkhtmltopdf。你得先安装wkhtmltopdf这个软件,再装pdfkit的Python包。写代码很简单。
import pdfkit
pdfkit.from_url('https://example.com', 'output.pdf')
但问题来了。很多现代网页用了JavaScript动态加载内容,wkhtmltopdf不会执行这些脚本。你得到的PDF可能只有个空壳子,关键内容都没了。另外wkhtmltopdf对CSS3的支持不太好,页面会变形。
第二种方法,用Selenium加上浏览器的打印功能。Selenium能控制真实的Chrome浏览器。代码会打开浏览器,加载完网页后,通过Chrome的打印对话框生成PDF。这样JS渲染的内容都能拿到。
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.get('https://example.com')
通过Chrome DevTools Protocol打印PDF
result = driver.execute_cdp_cmd('Page.printToPDF', {})
这个方法效果不错,网页图片、样式都很完整。缺点是你得装Chrome浏览器以及对应版本的驱动。代码啰嗦,运行还慢,每转一个网页要启动一次浏览器。
第三种方法,用Playwright。这是微软出的自动化工具。它内置了Chromium浏览器,你不用单独安装。它的PDF转换功能是原生支持的。代码比Selenium短很多。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto('https://example.com')
page.pdf(path='output.pdf')
Playwright会自动等待网页加载完成。遇到需要滚动才能显示的内容,你可以加两行代码滚动到底部。它生成的PDF跟浏览器里看到的一模一样。唯一的代价是安装包比较大,大概100多M,因为它内置了Chromium。
我个人推荐你用第三种。如果你经常要批量转网页,Playwright最省心。它不需要额外装浏览器,不用操心版本匹配问题。代码稳定,很少出幺蛾子。
你可能会想,转PDF时页面太长怎么办。你可以设置纸张大小和缩放比例。比如转成A4纸,页面太长就分页。这样打印出来也好看。
还有个小技巧。有些网页有弹窗广告,会影响PDF效果。你可以在Playwright里先隐藏特定元素,再生成PDF。代码也不复杂。
这三种方法我都用过。pdfkit适合老旧网站,Selenium适合调试学习,Playwright适合日常干活。你自己看着办吧。