2016-02-05 7 views
0

Я пытаюсь скопировать код pdftables из:
https://github.com/jeremyjbowers/pdftable/blob/master/pdftable.py
в Python3, но я столкнулся некоторые проблемы совместимости особенно с HTMLparser и связанных с ними функций.
В приведенном ниже коде: Как реплицировать функции save_bgn и save_end или что является заменой для того же в Python3.4Переход HTMLparser в Python3.x от Python2.x

def __init__(self, extractor, rows, columns): 
     self.extractor = extractor 
     self.set = extractor.set 
     self.rows = rows 
     self.columns = columns 
     self.html_parser = html.parser.HTMLParser(None) 
def filter(self, str): 
     str = re.sub(r'<[^>]+>', '', str) 
     self.set.html_parser.save_bgn() 
     self.set.html_parser.feed(str) 
     return self.set.html_parser.save_end() 

Любая помощь будет оценена. Спасибо.

ответ

1

Как я понимаю, 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() 
+0

Ваше предложение о том, чтобы удалить эти 3 строки и использовать re.sub в качестве полностью обработанного вызова. Оказывается, они не делают ничего, что мне нужно для тиражирования в версии 3.x. Большое спасибо! – catchingPatterns

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

  • Нет связанных вопросов^_^