【发布时间】:2017-08-23 14:21:12
【问题描述】:
我正在开发一个电报机器人。电报不允许发送太长的消息。我的机器人必须生成一个文本,如果它太长,我编写了一个函数将它拆分为列表中的更多消息,这样我就可以一个一个地发送它们。 我目前做的是:
message = "" # random text with variable lenght
max_chars_per_message = 4000
length_message = len(message)
splitted_message_list = []
for i in range(0, length_message, max_chars_per_message):
splitted_message = [message[i:i+max_chars_per_message]]
splitted_message_list.append(splitted_message)
它实际上工作正常。我的问题是文本是否包含 html 标签。我希望该函数能够执行以下操作:将消息拆分为每个“max_chars_per_message”字符,但如果消息以未关闭的 html 标签结尾,则在标签开始之前拆分消息并将该部分转换为以下拆分消息.
示例: 错误:
this is a <b> te|st </b> message
右:
this is a |<b> test </b> message
支持和使用的 HTML 标签是here
【问题讨论】:
-
另外,您是否考虑过当整个文本位于某个 HTML 标记内时会发生什么?
-
@brunodesthuilliers 我实际上不知道如何检查最后是否有未关闭的 html 标记并将该部分转换为以下消息。我在想检查是否有任何标签也有封闭的部分,但在那之后事情似乎很复杂
-
@Kendas 这是一个我没有考虑过的好点,因为生成的文本包含很多短标签。但这是一个很好的观点,我想在这种情况下,它应该在消息结束之前关闭标签,并在以下消息的开头添加另一个 start 标签。顺便说一句,目前我没有必要实现这个
-
如果“
some text here ”最终比 max_chars_per_message 长怎么办?-) -
@91DarioDev 我在官方文档中偶然发现了
HTMLParser。我不打算写一个有效的例子,所以我不知道它是否有效,但你可以看看它。至少您可以创建某种嵌套表示,它会告诉您需要关闭哪些标签等等。不过会有一些个边缘案例,但没有简单的答案。就像单独的开始标签占用的空间超过最大长度一样,但这也需要您自己弄清楚。