【问题标题】:Parse "quoted-printable" encoded text解析“quoted-printable”编码文本
【发布时间】:2018-02-01 05:35:05
【问题描述】:

我有一些用quoted-printable 编码的文本,其中软中断是用= 符号进行的。我正在寻找解析(而不是解码)这个文本。有什么办法可以阅读以下内容,

<span style=3D"text-decoration: line-through; color: rgb(156, 163, 173);">8=
/23/2017-&nbsp;&nbsp;Lorem ipsum dolor sit amet, fastidii sad.Vim graece&nb=
sp; tractatos

这样:

8/23/2017-        Lorem ipsum dolor sit amet, fastidii sad.Vim graece    tractatos

【问题讨论】:

    标签: python parsing quoted-printable


    【解决方案1】:

    似乎使用re 模块应该足够简单(这是未经测试的,来自内存:

    import re
    
    test_str = """<span style=3D"text-decoration: line-through; color: rgb(156, 163, 173);">8=
    /23/2017-&nbsp;&nbsp;Lorem ipsum dolor sit amet, fastidii sad.Vim graece&nb=
    sp; tractatos"""
    
    re.sub(r'=$', r'\n', test_str, flags=re.MULTILINE)
    

    但是既然你要求解析它。你想找回什么?解析通常意味着您将提取结构化数据,因此您的输入应该根据某种语法(似乎是这样):

    • 第一个字段是日期(特定格式)
    • 第二个字段是一条消息
    • 第三个字段(看起来像是第三个字段):类别

    编辑:

    最简单的形式:

    import quopri
    from HTMLParser import HTMLParser
    
    test_str = """<span style=3D"text-decoration: line-through; color: rgb(156, 163, 173);">8=
    /23/2017-&nbsp;&nbsp;Lorem ipsum dolor sit amet, fastidii sad.Vim graece&nb=
    sp; tractatos"""
    
    h = HTMLParser()
    print h.unescape(quopri.decodestring(test_str))
    

    【讨论】:

      【解决方案2】:

      解析器对于这个问题可能有点过分了,但是 pyparsing 是一个简单的解析库,可以处理一些更棘手的规则。此外,它还附带了一些已经内置的 HTML 标记表达式:

      import pyparsing as pp
      
      sample = """\
      <span style=3D"text-decoration: line-through; color: rgb(156, 163, 173);">8=
      /23/2017-&nbsp;&nbsp;Lorem ipsum dolor sit amet, fastidii sad.Vim graece&nb=
      sp; tractatos"""
      
      # strip all trailing '='
      sample = sample.replace("=\n", "")
      
      # convert =XX to char(int(XX)), like =3D -> '='
      hex_escape = pp.Regex(r'=[0-9a-fA-F]{2}')
      hex_escape.setParseAction(lambda t: chr(int(t[0][1:], 16)))
      sample = hex_escape.transformString(sample)
      
      # convert HTML entities like &nbsp; and suppress all opening and closing HTML tags
      pp.commonHTMLEntity.setParseAction(pp.replaceHTMLEntity)
      stripper = pp.anyOpenTag.suppress() | pp.anyCloseTag.suppress() | pp.commonHTMLEntity
      

      使用剥离器转换您的输入字符串:

      stripped = stripper.transformString(sample)
      print(stripped)
      

      打印

      8/23/2017-  Lorem ipsum dolor sit amet, fastidii sad.Vim graece  tractatos
      

      【讨论】:

        猜你喜欢
        • 2011-01-14
        • 2019-04-29
        • 2012-03-05
        • 2018-11-24
        • 2018-07-09
        • 2017-10-05
        • 2014-03-01
        • 2011-09-24
        • 1970-01-01
        相关资源
        最近更新 更多