0

我有一些用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
4

2 回答 2

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))
于 2017-08-23T14:57:19.017 回答
0

对于这个问题,解析器可能是矫枉过正,但 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
于 2017-08-26T16:08:02.817 回答