导入requests_html后ANSI格式失效问题及修复方案咨询
解决导入requests_html后ANSI文本格式失效的问题
我明白你遇到的麻烦——用ANSI转义码设置的加粗、下划线格式,在导入requests_html的HTMLSession后就失效了,但字符串本身的内容明明没变化(__repr__输出一直正常)。这个问题确实是requests_html模块的锅,它在导入时会悄悄修改终端的输出设置,导致ANSI转义码的部分格式被忽略。
下面给你几个可行的修复方案:
方案1:延迟导入requests_html
最简单的办法就是把requests_html的导入语句放到所有需要输出带格式文本的代码之后。这样在终端还没被修改前,就已经完成了格式输出,后续导入模块不会影响已经输出的内容,也不会干扰之后的格式显示。
修改后的代码示例:
bold = "\033[1m" underlined = "\033[4m" red = "\033[91m" endc = "\033[0m" def red_bold_underlined(string): return bold + underlined + red + string + endc x = red_bold_underlined('stackoverflow question') print(x) print(x.__repr__()) print() print(x) print(x.__repr__()) # 把导入放到所有输出操作之后 from requests_html import HTMLSession
方案2:重置标准输出流
requests_html导入时可能替换了sys.stdout对象,导致终端无法正确解析ANSI转义码。我们可以手动将stdout重置为系统原始的输出对象,恢复ANSI格式支持。
代码示例:
bold = "\033[1m" underlined = "\033[4m" red = "\033[91m" endc = "\033[0m" def red_bold_underlined(string): return bold + underlined + red + string + endc # 先导入模块 from requests_html import HTMLSession import sys # 重置stdout为系统原始输出 sys.stdout = sys.__stdout__ x = red_bold_underlined('stackoverflow question') print(x) print(x.__repr__()) print() print(x) print(x.__repr__())
方案3:强制设置终端环境变量
有时候requests_html会修改TERM环境变量,让终端认为自己不支持ANSI格式。我们可以手动设置TERM为支持完整ANSI转义的类型,比如xterm-256color。
代码示例:
import os # 先设置终端环境变量 os.environ['TERM'] = 'xterm-256color' # 再导入requests_html模块 from requests_html import HTMLSession bold = "\033[1m" underlined = "\033[4m" red = "\033[91m" endc = "\033[0m" def red_bold_underlined(string): return bold + underlined + red + string + endc x = red_bold_underlined('stackoverflow question') print(x) print(x.__repr__()) print() print(x) print(x.__repr__())
为什么会出现这个问题?
本质上是requests_html在导入过程中,其依赖的浏览器自动化相关组件会调整终端的输出模式,或者修改标准输出流的属性,导致终端不再识别ANSI转义码中的加粗和下划线控制字符。但字符串本身的字节内容并没有改变,所以__repr__输出始终能显示完整的转义码。
内容的提问来源于stack exchange,提问作者alexzander
相关产品推荐
相关产品推荐

