Python для сохранения веб-страниц в формате PDF
Итак, у меня есть список веб-страниц, которые я хочу сохранить в формате PDF. Они похожи на http://nptel.ac.in/courses/115103028/module1/lec1/3.html. Список очень длинный, поэтому я использую python для автоматизации процесса. Это мой код
import pdfkit
import urllib2
page = urllib2.urlopen('http://nptel.ac.in/courses/115103028/module1/lec1/3.html')
page_content = page.read()
with open('page_content.html', 'w') as fid:
fid.write(page_content)
txt=open("page_content.html").read().split("\n")
txt1=""
for i in txt:
if not ".html" in i:
txt1+=i+"\n"
with open('page_content.html',"w") as f:
f.write(txt1)
config = pdfkit.configuration(wkhtmltopdf="C:\Program Files (x86)\wkhtmltopdf\\bin\\wkhtmltopdf.exe")
pdfkit.from_file('page_content.html', 'out.pdf',configuration=config)
Но вывод PDF, который я получаю, не содержит изображений уравнений, только текст. Как мне это решить? Кроме того, я открываю файл во второй раз, чтобы удалить цифры сверху и снизу веб-страницы, вы также можете помочь мне улучшить это.
РЕДАКТИРОВАТЬ:
Это код, который я сейчас использую
import os.path,pdfkit,bs4,urllib2,sys
reload(sys)
sys.setdefaultencoding('utf8')
url = 'http://nptel.ac.in/courses/115103028/module1/lec1/3.html'
directory, filename = os.path.split(url)
html_text = urllib2.urlopen(url).read()
html_text = html_text.replace('src="', 'src="'+directory+"/").replace('href="', 'href="'+directory+"/")
page = bs4.BeautifulSoup(html_text, "html5lib")
for ul in page.findAll("ul", {"id":"pagin"}):
ul.extract() # Deletes the tag and everything inside it
html_text = str(page)
config = pdfkit.configuration(wkhtmltopdf="C:\Program Files (x86)\wkhtmltopdf\\bin\\wkhtmltopdf.exe")
pdfkit.from_string(html_text, "out.pdf", configuration=config)
Он по-прежнему показывает те ошибки, часть сообщения об ошибке, и выходной PDF не имеет никаких изображений
Loading pages (1/6)
Warning: Failed to load http://nptel.ac.in/courses/115103028/css/style.css (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image041.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image042.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image043.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image045.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image046.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image048.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image049.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image050.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image051.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image052.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image053.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image054.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image055.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image056.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image057.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image064.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image065.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image067.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image068.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image069.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image070.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image071.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image072.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image073.png (ignore)
Warning: Failed to load http://nptel.ac.in/courses/115103028/module1/lec1/images/image074.png (ignore)
Warning: Failed to load file:///C:/Users/KOUSHI~1/AppData/images/1h.jpg (ignore)
Warning: Failed to load file:///C:/Users/KOUSHI~1/AppData/images/2h.jpg (ignore)
Warning: Failed to load file:///C:/Users/KOUSHI~1/AppData/images/3h.jpg (ignore)
Warning: Failed to load file:///C:/Users/KOUSHI~1/AppData/images/4h.jpg (ignore)
Warning: Failed to load file:///C:/Users/KOUSHI~1/AppData/images/5h.jpg (ignore)
Warning: Failed to load file:///C:/Users/KOUSHI~1/AppData/images/6h.jpg (ignore)
Warning: Failed to load file:///C:/Users/KOUSHI~1/AppData/images/7h.jpg (ignore)
Warning: Failed to load file:///C:/Users/KOUSHI~1/AppData/images/8h.jpg (ignore)
Warning: Failed to load file:///C:/Users/KOUSHI~1/AppData/images/9h.jpg (ignore)
Warning: Failed to load file:///C:/Users/KOUSHI~1/AppData/images/10h.jpg (ignore)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done
1 ответ
Когда я запускаю ваш код, pdfkit выводит много предупреждений, которые выглядят так:
Warning: Failed to load file:///C:/Users/.../images/image041.png (ignore)
pdfkit пытается найти изображения на веб-сайте на моем компьютере, и, поскольку я их не загружал, их невозможно найти. Небольшой взлом вокруг этой проблемы - преобразование относительных путей в исходном коде HTML в абсолютные пути:
import os.path
url = 'http://nptel.ac.in/courses/115103028/module1/lec1/3.html'
directory, filename = os.path.split(url)
html_text = urllib2.urlopen(url).read()
html_text = html_text.replace('src="', 'src="'+directory+"/") \
.replace('href="', 'href="'+directory+"/")
Вот directory
каталог, в котором находится сайт, в данном примере это http://nptel.ac.in/courses/115103028/module1/lec1
и так
<img src="images/image041.png" width="63" height="21">
становится
<img src="http://nptel.ac.in/courses/115103028/module1/lec1/images/image041.png" width="63" height="21">
Теперь вы можете использовать pdfkit.from_string
вместо pdfkit.from_file
чтобы создать файл PDF без сохранения некоторой временной информации:
pdfkit.from_string(html_text, "out.pdf", configuration=config)
Чтобы удалить ссылки на другие страницы (которые отображаются в виде чисел) из верхней и нижней части сайта, у вас есть масса возможностей. Мой любимый использует BeautifulSoup
найти ul
теги с id="pagin"
, Эти теги содержат ссылки на другие страницы, и вы можете просто удалить их:
import bs4
page = bs4.BeautifulSoup(html_text)
for ul in page.findAll("ul", {"id":"pagin"}):
ul.extract() # Deletes the tag and everything inside it
html_text = unicode(page)
И сейчас html_text
больше не содержит этих нежелательных ссылок. Для установки BeautifulSoup просто используйте pip: python -m pip install bs4
Это решение, очевидно, работает только в том случае, если все ваши сайты структурированы таким образом, если нет, вы также можете удалить все a
теги, чтобы избавиться от этих ссылок, но будьте осторожны, чтобы не удалить необходимую информацию.