Как я понимаю, pdftable.py преобразует таблицу pdf в CSV-файл, используя html в качестве посредника.
Поскольку pdftable использует htmllib, который был устарел в 2.6 в пользу модуля HTMLParser, ваша проблема связана не с переходом с 2.x HTMLParser.HTMLParser на 3.x html.parser.HTMLParser, но с переходом от 2.x htmllib.HTMLParser - 2.x HTMLParser.HTMLParser. Несмотря на то, что имя класса осталось HTMLParser, API совсем другой для всего, кроме метода .feed (text). Чтобы переписать код htmllib, нужно понять, что он делает, поскольку механическая замена невозможна.
Для htmllib подпись является HTMLParser (formatter), где предполагается, что форматер является одним из классов в модуле форматирования или его подклассе. (Модуль форматирования был устаревшим в 3.4, так как удаление htmllib left почти не используется.) Предполагается, что один экземпляр подкласса HTMLParser с добавленными тегами. Однако pdftable использует пустой парсер.
self.html_parser = htmllib.HTMLParser(None)
В первой строке filter
,
str = re.sub(r'<[^>]+>', '', str)
регулярное выражение, как представляется, соответствует теги и замена удаляет их. В течение следующих трех линий
self.set.html_parser.save_bgn()
self.set.html_parser.feed(str)
return self.set.html_parser.save_end()
save_bgn()
говорит, чтобы начать «сохранение символьных данных в буфере вместо того, чтобы отправить его в объект форматировочного.» (Хорошо, потому что нет форматировщика.) Без тегов и методов тегов я не знаю, что кормит строку через парсер. Я не удивлюсь, если ответ будет «Ничего». Если это так, то ваш ответ будет состоять в том, чтобы удалить три строки и, возможно, def filter
, заменив вызов filter() вызовом re.sub.
Чтобы узнать, я предлагаю добавить некоторые утверждения печати 2.x для фильтрации, а затем запустить в 2.7 с вашим примером pdf-файла.
def filter(self, str):
print 'Before replace:', str
str = re.sub(r'<[^>]+>', '', str)
print 'After replace:', str
self.set.html_parser.save_bgn()
print 'After parse:', str
self.set.html_parser.feed(str)
return self.set.html_parser.save_end()
Ваше предложение о том, чтобы удалить эти 3 строки и использовать re.sub в качестве полностью обработанного вызова. Оказывается, они не делают ничего, что мне нужно для тиражирования в версии 3.x. Большое спасибо! – catchingPatterns