从 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()
我正在尝试从 :
复制 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()