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

2024-06-02 11:38:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从以下位置复制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()

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


Tags: columns代码selfparsersavedefhtmlrows
1条回答
网友
1楼 · 发布于 2024-06-02 11:38:30

据我所知,pdftable.py使用html作为中介,将pdf表格转换为.csv文件。在

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

对于htmllib,签名是HTMLParser(formatter),其中formatter应该是formatter模块中的一个类或其子类。(格式化程序模块在3.4中被弃用,因为删除htmllib left几乎没有用)其目的是用添加的标记方法实例化HTMLParser的一个子类。但是,pdftable使用空解析器。在

    self.html_parser = htmllib.HTMLParser(None)

filter的第一行中

^{pr2}$

正则表达式显示为匹配标记,替换将删除它们。接下来的三行

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

相关问题 更多 >