用正则表达式美化Beautifulsoup生成的xml

时间:2018-08-25 12:56:23

标签: regex xml python-requests markup pretty-print

我正在尝试获取有效的漂亮打印xml,以便将其进一步传递给Ticks and Frames: 60 (should be "Saving...Did delete file: true/false")

但是,BeautifulSoup“修饰”的xml看起来像这样:

requests

描述这样混乱的输出的简便方法,here

...
 <typ>
  TYPE_1
 </typ>
 <rte>
  AL38941XXXXX
 </rte>
 <sts>
  ADDED
 </sts>
...

给出:

text_re = re.compile('>\n\s+([^<>\s].*?)\n\s+</', re.DOTALL)    
prettyXml = text_re.sub('>\g<1></', uglyXml)

但是,当涉及到空值时,正则表达式只是跳过它们,当解析的字符串中的某些值为空时,这会导致问题。

示例:

 <typ>TYPE_1</typ>
 <rte>AL38941XXXXX</rte>
 <sts>ADDED</sts>

然后 <typ>TYPE_1</typ> <rte>AL38941XXXXX</rte> <sts>ADDED</sts> <ref> </ref> 尝试在空标记中使用参数requests运行查询,这将导致错误的查询结果。

我对regex并不是很流利,所以尝试在另一个regex中' '失败了并像这样黑了:

>\n\s+</

所有“漂亮”标记都不幸消失了... 可以,但是应该如何正确完成呢?

1 个答案:

答案 0 :(得分:0)

从评论中可以看出,不要打扰美化输出。

如果出于调试目的,您想美化并且需要依靠BeautifulSoup来完成此任务,并且需要额外的步骤来“固定”文本节点,则可以尝试使用此正则表达式:

table

替换为:(<([^\/>]+)>)\s+(?:([\s\S]*?)\s+)??(<\/\2>)

Demo

但是,请记住,正则表达式可能不是正确的工具。证明是以前的正则表达式将因以下CDATA内容而失败:

$1$3$4

当然,我们可以对正则表达式进行微调以考虑CDATA节,但是即使这样,也可能会出现其他问题。因此,最好使用XML解析器。甚至更好地使用一些XML修饰符,以允许不更改文本节点。我认为在您链接的SO问题上,有一些建议。