从Python2.x转换Python3.x中的HTMLParser

时间:2016-02-05 13:07:42

标签: python python-3.x html-parser

我试图复制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()

任何帮助将不胜感激。 感谢。

1 个答案:

答案 0 :(得分:1)

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

由于pdftable使用的htmllib在2.6中被弃用而不支持HTMLParser模块,因此问题不在于从2.x HTMLParser.HTMLParser到3.x html.parser.HTMLParser的过渡,而是从2过渡到.x htmllib.HTMLParser到2.x HTMLParser.HTMLParser。尽管类名仍然是HTMLParser,但除了.feed(text)方法之外的其他所有API都是完全不同的。为了重写htmllib代码,必须了解它正在做什么,因为机械替换是不可能的。

对于htmllib,签名是HTMLParser(格式化程序),其中formatter应该是formatter模块或其子类中的一个类。 (格式化程序模块在3.4中已弃用,因为htmllib的删除几乎未被使用。)目的是使用添加的标记方法实例化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,用re.sub调用替换filter()调用。

为了找到答案,我建议添加一些2.x打印语句进行过滤,然后使用示例pdf文件在2.7上运行。

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()