2015-05-26 2 views
0

Я пытаюсь получить некоторые данные из pdf-документа, используя scraperwiki для pyhon. Это прекрасно работает, если я загрузить файл с помощью urllib2 как так:Использование scraperwiki для pdf-файла на диске

pdfdata = urllib2.urlopen(url).read() 
xmldata = scraperwiki.pdftoxml(pdfdata) 
root = lxml.html.fromstring(xmldata) 
pages = list(root) 

Но вот идет сложная часть. Поскольку я хотел бы сделать это для большого количества pdf-файлов, которые у меня есть на моем диске, я бы хотел покончить с первой строкой и передать файл pdf напрямую в качестве аргумента. Однако, если я пытаюсь

pdfdata = open("filename.pdf","wb") 
xmldata = scraperwiki.pdftoxml(pdfdata) 
root = lxml.html.fromstring(xmldata) 

Я получаю следующее сообщение об ошибке

xmldata = scraperwiki.pdftoxml(pdfdata) 
File "/usr/local/lib/python2.7/dist-packages/scraperwiki/utils.py", line 44, in pdftoxml 
pdffout.write(pdfdata) 
TypeError: must be string or buffer, not file 

Я предполагаю, что это происходит потому, что я не открывать PDF правильно?

Если да, есть ли способ открыть pdf-файл с диска так же, как urllib2.urlopen() делает?

ответ

0

urllib2.urlopen (...). Read() делает только то, что он считывает содержимое потока, возвращаемого с URL-адреса, который вы передали в качестве параметра.

Хотя open() возвращает обработчик файла. Точно так же, как urllib2 должен был выполнить вызов open(), тогда вызов read() также выполняет обработчики файлов.

Измените программу, чтобы использовать следующие строки:

with open("filename.pdf", "rb") as pdffile: 
     pdfdata=pdffile.read() 

xmldata = scraperwiki.pdftoxml(pdfdata) 
root = lxml.html.fromstring(xmldata) 

При этом откроется PDF затем прочитать его содержимое в буфер с именем pdfdata. Оттуда ваш вызов scraperwiki.pdftoxml() будет работать так, как ожидалось.

+0

Спасибо. Это решило оригинальную проблему. Однако теперь я получаю другую ошибку: 'root = lxml.html.fromstring (xmldata) ... lxml.etree.XMLSyntaxError: None' (Полный текст ошибки слишком длинный для комментария). Я предполагаю, что это не связано с моим первоначальным вопросом, но все же понимание очень ценится! –

+0

Вы могли бы ответить с помощью палочки для вашего кода? –

+0

Код: http://pastebin.com/3LUpqQ84 Полное сообщение об ошибке: http://pastebin.com/WK74TS8B –

Смежные вопросы