我试图复制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()
任何帮助将不胜感激。 感谢。
答案 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()