python - вытащить pdf-файлы с веб-страницы и преобразовать в html

Моя цель состоит в том, чтобы иметь скрипт python, который будет получать доступ к определенным веб-страницам, извлекать все файлы PDF на каждой странице, в имени файла которых есть определенное слово, преобразовывать их в html/xml, а затем просматривать файлы html для чтения данных из PDF-файлов. столы.

До сих пор я импортировал механизм (для просмотра страниц/поиска pdf-файлов) и у меня есть pdfminer, однако я не уверен, как использовать его в скрипте для выполнения тех же функций, что и в командной строке.

Какая группа библиотек наиболее эффективна для решения моей задачи и как бы вы рекомендовали подходить к каждому шагу? Я извиняюсь, если это слишком специфично для stackoverflow, но у меня возникли проблемы с использованием поиска Google и скудной документации, чтобы собрать воедино, как это закодировать. Спасибо!


РЕДАКТИРОВАТЬ: Итак, я решил использовать Scrapy. Пока мне это очень нравится, но теперь у меня новый вопрос. Я определил класс PDFItem() для использования с моим пауком с полями title и url. У меня есть селектор, который захватывает все ссылки, которые я хочу, и я хочу пройти по этим ссылкам и создать PDFItem для каждой из них. Вот код, который у меня есть ниже:

links = sel.xpath('//a[contains(@href, "enforcementactions.pdf") and contains(@class, "titlelink")]')
item = PDFItem()
for link in links:
        item['title'] = link.xpath('/text()')
        item['url'] = URL + link.xpath('@href').extract()[0]

Строка URL работает хорошо, но я не знаю, как сделать то же самое для заголовка. Думаю, я мог бы просто выполнить запрос вверху, но добавив '/text()' в конец селектора, но это кажется чрезмерным. Есть ли лучший способ просто просмотреть каждый объект ссылки в массиве ссылок и получить текст и значение href?


person maniciam    schedule 18.02.2014    source источник


Ответы (2)


Я бы использовал Scrapy. Scrapy — лучший инструмент для сканирования всего веб-сайта и создания списка всех ссылок PDF. Такого паука было бы очень легко написать. Вам определенно не нужен Mechanize.

После этого я использовал Poppler для преобразования каждого файла PDF в HTML. Это не модуль Python, но вы можете использовать команду pdftohtml. По моему опыту, у меня были лучшие результаты с Poppler, чем с PDFMiner.

Изменить:

links = sel.xpath('//a[contains(@href, "enforcementactions.pdf") and contains(@class, "titlelink")]')
for link in links:
    item = PDFItem()
    item['title'] = link.xpath('text()').extract()[0]
    item['url'] = URL + link.xpath('@href').extract()[0]
person nathancahill    schedule 18.02.2014
comment
Поэтому я решил использовать Scrapy, но теперь у меня новая проблема. Пожалуйста, просмотрите мое редактирование выше - person maniciam; 21.02.2014
comment
код, который вы разместили, выходит из строя: индекс списка вне диапазона - person maniciam; 21.02.2014
comment
Не видя HTML, который вы анализируете, трудно сказать, почему. - person nathancahill; 21.02.2014
comment
Попробуйте xpath('text()') вместо xpath('/text()') - person nathancahill; 21.02.2014
comment
comment
Это сделало это на самом деле. Благодарю вас! - person maniciam; 21.02.2014
comment
давайте продолжим это обсуждение в чате - person maniciam; 21.02.2014

Для просмотра и поиска ссылок в формате PDF с веб-страницы достаточно библиотеки URL-адресов. Mechanize, как следует из документации, используется для автоматизации взаимодействия с веб-сайтом. Учитывая ваше описание, я считаю это ненужным.

pdf2txt.py PDFMiner преобразует PDF в HTML. Поэтому вам нужно вызвать эту программу в качестве подпроцесса в вашем скрипте для создания выходных HTML-файлов.

Таким образом, вам понадобятся библиотеки HTTP, такие как Requests и PDFMiner.

Рабочий процесс вашего скрипта будет примерно таким:

import os
import requests
from subprocess import Popen

...
r = requests.get(<url-which-has-pdf-links>)
# Do a search for pdf links in r.text
...
for pdf_url in pdf_links:
    # get the PDF content and save it to a local temp file
...
# Build the command line parameters, the way pdf2txt expects
# Invoke the PDFMiner's pdf2txt on the created file as a subprocess
Popen(cmd)

Дополнительная информация об использовании Requests для сохранения файла PDF в качестве локального файла: здесь. Подробнее о запуске программ в качестве подпроцессов здесь

person shaktimaan    schedule 18.02.2014