从 Python2.x 过渡 Python3.x 中的 HTMLParser

Transitioning HTMLParser in Python3.x from Python2.x

我正在尝试从 :
复制 pdftables 代码 https://github.com/jeremyjbowers/pdftable/blob/master/pdftable.py
在 Python3 中,但我面临一些兼容性问题,尤其是与 HTMLparser 和相关函数的兼容性问题。
在下面的代码中:如何复制 save_bgn 和 save_end 的功能,或者 Python3.4

中相同功能的替代品是什么
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()

如有任何帮助,我们将不胜感激。 谢谢

据我了解,pdftable.py 通过使用 html 作为中介将 pdf table 转换为 .csv 文件。

因为 pdftable 使用 htmllib,它在 2.6 中被弃用,取而代之的是 HTMLParser 模块,你的问题不在于从 2.x HTMLParser.HTMLParser 的转换到 3.x html.parser.HTMLParser,但随着从 2.x htmllib.HTMLParser 到 2.x HTMLParser.HTMLParser 的过渡。尽管 class 名称仍然是 HTMLParser,但 API 对于除 .feed(text) 方法之外的所有内容都非常不同。为了重写 htmllib 代码,必须了解它在做什么,因为机械替换是不可能的。

对于htmllib,签名是HTMLParser(formatter),其中formatter应该是formatter模块中的classes之一,或者它的子class . (格式化程序模块在 3.4 中被弃用,因为删除了 htmllib left 几乎没有使用。)目的是用添加的标记方法实例化 HTMLParser 的子class。但是,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() 说开始 "saving character data in a buffer instead of sending it to the formatter object." (好东西,因为没有格式化程序。)没有标签和标签方法,我不知道通过解析器提供字符串是做什么的.如果答案是 "Nothing",我不会感到惊讶。如果是这样,您的答案是删除这三行,并且可能 def filter,用 re.sub 调用替换 filter() 调用。

为了找出答案,我建议添加一些 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()