python如何换行输入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python如何换行输入相关的知识,希望对你有一定的参考价值。
参考技术A Python换行输入的方法:可使用反斜杠连接多行代码,另一种方法是将代码或字符串用小括号括起来,实现换行;还可以用三个单引号。在用户提交的内容中呈现换行符(Python Web 应用程序)
【中文标题】在用户提交的内容中呈现换行符(Python Web 应用程序)【英文标题】:Rendering newlines in user-submitted content (Python web app) 【发布时间】:2012-07-06 13:21:25 【问题描述】:我有一个 web.py 应用程序,它从文本区域获取输入并将其输入到数据库。我可以从数据库中获取信息并将其发布到页面但 NEWLINES 消失了。发回 HTML 时如何保留换行符?数据中确实包含\r\n
,但它不会在 HTML 中呈现为 NEWLINES。有什么想法吗?这是一个小例子:
(2, u'Title', u'content here...hey\r\nthis\r\nhas\r\nbreaks in it....?',
datetime.datetime(2012, 7, 5, 21, 5, 14, 354516))
这是我从数据库返回的。我需要\r\n
来代表<br />
,如果有两个<p>
会很棒。任何方向将不胜感激。
还有这个库吗?我听说过 markdown 和 mark up,但我找不到如何从 python 字符串发布 html 数据的示例?
【问题讨论】:
如果我能让 \r\n 代表一个那就太好了。
这是一个三班轮:***.com/questions/10436458/… 【参考方案1】:换行符不呈现为换行符是 html 中的预期行为。您想要的是插入<br>
或将您的输入解析为文本段落并用<p>
..</p>
包装它们
我会混合使用这两种方法:将<br>
用于单个换行符,将<p>
..</p>
用于双换行符。您可以在保存到数据库时或在将其取出时进行此解析。
编辑:我为您制作了以下图形。查看解析器的方法有很多种。就个人而言,我想将它们视为一种状态机。为了实现它,您应该以流的方式读取输入字符串,例如使用http://docs.python.org/library/stringio.html。
Edit2:将描述“下推自动机”更改为“状态机”。下推自动机是正确的,但不精确,并且与图表不匹配 - 我将两者混合在一起。
Edit3:这里有一些关于如何在代码中实现状态机解析器的 sudo 代码,使用 while 循环、switch case 和状态转换的 if 语句。
state = 'plainState'
streamer = get_stream_reader_from_input()
buffer = ''
while true
nextchar = streamer.readchar()
if (nextchar == null) //EOS
print(buffer)
exit
switch (state)
case('plainState')
if (nextchar == '\n')
state = 'singleBreakState'
else if (nextchar == '\r')
state = 'CRState'
else
buffer += nextchar
case('singleBreakState')
if (nextchar == '\n')
state = 'doubleBreakState'
else if (nextchar == '\r')
state = 'CRState2'
else
state = 'plainState'
buffer += '<br>' + nextchar
//...
【讨论】:
您刚刚重新发布了我的问题...如果您展示了如何将换行符解析为 ,那就太好了 @Helgi:感谢您的支持和编辑。有错字吗?有没有办法在这里查看差异? Paxwell:请参阅上面的更新。如果您在如何实现这样的事情上需要更多帮助,请告诉我。我同意 Helgi 不添加另一个库,但还有另一个原因:编写解析器是每个程序员都应该做几次的事情。学习此类基本任务可以让您以后自行解决更复杂的问题。 @MichelMüller:要查看差异,请单击帖子下方的时间戳链接(“4 小时前编辑”)。实际上,我将</br>
(注意/
的位置)更改为<br>
。可能是<br/>
,但我们这里似乎不是在谈论 XHTML。【参考方案2】:
执行此操作的两种主要方法。最简单的方法是将输出包装在 <pre></pre>
中,这将按照输入的格式对其进行格式化。
或者,您可以用<br />
(而不是<p>
)替换newlies,因为字符代表换行符而不是段落。
对于第二种选择,这是一种方法:
>>> s
'hello\nthere\r\nthis\n\ris a test'
>>> r = '<br />'
>>> s.replace('\r\n',r).replace('\n\r',r).replace('\r',r).replace('\n',r)
'hello<br />there<br />this<br />is a test'
>>>
或者第三个选项 - 使用众多文本输入库/格式之一并通过它们呈现内容(正如其他人所提到的 - 如降价)。
但是,如果您只想做一个简单的替换,那就太过分了。
【讨论】:
<pre>
禁用文本换行(我认为它是文本,而不是代码)。所以这比没用还糟糕。替换具有您应该真正提到的安全隐患。
没有安全影响,因为替换和搜索文本都是固定的;问题很简单——他想渲染输入的文本,回车显示为换行符。
OP 似乎在使用 Jinja,默认情况下会转义 HTML。一旦我们开始在输出中插入标签,Jinja 转义(safe
过滤器)应该被关闭,因为它也会转义插入的<br />
s。因此,我们应该手动对用户输入的文本进行转义,这是以前不需要的操作。
对于像我这样正在寻找 jinja2 解决方案的人,下面的 *** 链接可以回答这个问题。我很难找到这个答案,所以把链接放在这里***.com/questions/10436458/…【参考方案3】:
在提出解决方案之前,您需要对正在发生的事情有一些基本的了解。如果你不理解这个问题,那么“扔进另一个库”的方法要么根本不起作用(更好),要么很快就会适得其反(更糟)。
@MichelMüller 正确地指出 HTML 源代码中的 \n
s 不会在浏览器中呈现。有关此行为的更详细说明,请参阅this tutorial(警告,HTML 2.0 描述)。现在,要在 HTML 中添加换行符,请使用 <br>
;换一个新段落,<p>
。
您可以做很多事情来实现这一目标,但您要解决的问题是什么?这个用户提交的内容是什么?谁提交?需要考虑的两个方面是:
-
格式化。是公共网站上的评论,还是网站工作人员准备的帖子,还是 Stack Overflow 等网站上的 UGC?
安全。它是由陌生人发布的,还是由完全信任的用户发布的,还是介于两者之间?
可能的解决方案:
最直接的方法是在输出到模板格式化程序之前运行text.replace('\r\n', '<br>')
。如果您不在模板中放置 text | safe
,则 in 将不起作用,因为 Jinja 不应逃避您生成的 <br>
s。但是,文本本身不应该完全信任,因此您必须转义 <
和 &
(至少)在替换换行符之前。
查看MarkupSafe,了解处理 HTML 转义的不那么特别的方法。顺便说一句,它是由 Jinja 使用的。
对于非结构化内容的格式(即用户提交的 cmets a la YouTube),请查看 PottyMouth 库。
如果您的内容准备充分(博客平台或类似 Stack Overflow 的网站上的帖子),请尝试 @BernhardKircher 建议的 Markdown。它有一些学习曲线,所以如果用户愿意花一些时间写帖子,效果最好。记得正确配置解析器,因为核心 Markdown 不会转义 HTML。
对于员工准备的内容,您可以使用 Markdown 或更复杂的东西。这真的取决于员工的背景。在这里,未转义的 HTML 可能是一种祝福,而不是一种诅咒。
【讨论】:
【参考方案4】:您可以使用诸如markdown之类的格式化语言(如您所提到的),而不是使用不是html的插入文本,因此不会显示为html(\r\n不是“p”标签等) .
否则您将需要手动替换/解析输入的文本(我认为这不是一个好主意,因为已经为此发明了诸如 markdown 之类的语言)。
有一些很好的 python 库可以将 markdown(您存储在数据库中的数据)转换为 html,例如 python-markdown2。
它真的很容易使用,请参阅 python-markdown 链接中的示例:
>>> import markdown2
>>> markdown2.markdown("*boo!*") # or use `html = markdown_path(PATH)`
u'<p><em>boo!</em></p>\n'
>>> markdowner = Markdown()
>>> markdowner.convert("*boo!*")
u'<p><em>boo!</em></p>\n'
>>> markdowner.convert("**boom!**")
u'<p><strong>boom!</strong></p>\n'
这会强制您使用 markdown 语法(或您使用的任何格式)输入内容。为了使这更容易,您可以使用 wysiwyg-editor 为您创建降价(就像 *** 上的编辑器)。 我认为 *** 使用了wmd,但还有很多其他 Markdown 所见即所得的编辑器。
wmd 示例:
<html>
<head>
<title>WMD Example using jquery</title>
<link rel="stylesheet" type="text/css" href="wmd.css"/>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="jquery.wmd.min.js"></script>
</head>
<body>
<h1>WMD Example using jquery</h1>
<div>
<textarea id="notes"/>
</div>
<script type="text/javascript">
$().ready(function()
$("#notes").wmd();
);
</script>
</body>
</html>
【讨论】:
wms 还是 wmd?如果您能举例说明如何将 hi\r\n 转换为hi
您的答案内容丰富但缺乏直接答案 @Paxwell 抱歉,我拼错了 JS 库,它的 WMD(我在回答中更正了它)。你是对的,我的回答并没有告诉你如何用 html 标签替换 \r\n,但它建议以不同的方式处理输入,所以不要插入包含 \r\n 等的“纯”文本。我会使用Markdown 编辑器,允许用户输入文本并使用更多选项对其进行格式化。例如,当使用 python 库将用户输入(在你的数据库中是 markdown 和 sorted)转换回 html 时,应该正确显示换行符。以上是关于python如何换行输入的主要内容,如果未能解决你的问题,请参考以下文章