如何在Python中将HTML字符串拆分为更短的HTML字符串?(添加了一些有趣的内容)

0 投票
2 回答
1205 浏览
提问于 2025-04-16 18:57

我在这个问题上遇到了很大的困难。

编辑:我把这个编辑放在最上面:如果有人想了解这个问题和更多内容,欢迎阅读。我开始解决这个很难的问题,但又遇到了新的问题。我想到的办法是把整个长HTML页面按段落(“p”标签)分开返回。到目前为止,一切都正常,当我执行assert False时,我得到了我想要的结果。然后在模板中,我遍历我在响应中发送的列表,对于每个值(一个段落),我现在创建一个div(书中的一页),这里就是问题所在。我发现每个段落出现了三次!代码如下...

assert (part of it):
<p style="text-align: center;">
<span style="font-size:24px;"><strong><u>The Ten Foot Stop</u></strong></span></p>,
<p  style="margin-bottom: 0.2in; text-align: center;">
<span style="font-size:18px;"><font style="font-size: 7pt;">NEWS AND OCCASIONAL ITEMS 
ABOUT THE MEDICAL ASPECTS OF SCUBA DIVING.<br />
POSTED BY ERN CAMPBELL, MD</font></span></p>

template:
{% for article_page in article_pages %}
    {% if article_page %} <!-- don't show an empty paragraph -->
       {{ article_page|safe }}
    {% endif %}
{% endfor %}

show this in page:
[The Ten Foot Stop, The Ten Foot Stop, The Ten Foot Stop]
<!-- first paragraph has: The Ten Foot Stop -->

以下是我原始帖子中所有问题的描述: 我有一个非常长的HTML样式字符串(没有头部或主体等内容,但有标签和样式、图片标签以及其他所有内容),我需要根据单词数量将这个字符串分割成更小的字符串(需要让字符串适应特定大小的div——比如说每165个单词左右,或者更好的是适应特定高度,这样就能适应div的大小——但我觉得后者要复杂得多)。

我遇到的问题是,我尝试了各种方法,包括BeautifulSoup等,但我找不到一种方法来分割字符串,同时保持标签的完整性……比如说,如果我有一个样式标签,它的开始位置在第160个字符,结束位置在第170个字符,那么第二页(div)会把样式当作普通字符串处理,而BeautifulSoup只会关闭“坏”的标签,正如我所看到的,并不会为第二、第三个div中的“坏”文本打开标签……

我还考虑过使用text.py中的truncate_html_words,但顾名思义,这只是截断单词,并不会保留下一页的其余文本(或者我错了吗)?

有没有人知道怎么解决这个问题?

好的,我开始慢慢弄明白这个问题了,完成后我会发布出来,我觉得人们需要这种东西。下一步是,我按标签(在我的情况下是每个HTML的“p”标签)分割了HTML字符串。现在我该如何计算标签中的文本数量,仅计算文本?(注:标签可能有子标签包裹文本,也可能有多个子标签,比如:

  • a
  • bcd

,需要返回的只计算2——两个单词)?

谢谢,

Erez

2 个回答

0

我看到你在尝试分割时保持html标签不变。我只是想找一个方法,把一个很长的html字符串每n个字符分割一次,然后把这些较小的字符串添加到一个.txt文件中,每一行一个。然后在我的应用程序中,我使用这些较小的字符串从服务器发送网页的部分内容到客户端。
我在这里发布了我工作的脚本:https://stackoverflow.com/a/70287092/13795525

1

可以先从简单的开始,给自己设定一些合理的、有限的情况来处理,比如在 <p> 标签处换行、只显示图片的 alt 文本而不显示图片、并且不处理 div 标签。先看看这样做效果如何。然后再考虑是否要处理图片大小,或者只是给用户提供一个热点,让他们点击查看图片。接下来最重要的是处理 div 标签。可以先从不嵌套的 div 开始,确保在处理 <p> 标签时,能够保留当前 div 的格式。之后再增加嵌套,使用一个格式指令的堆栈,在遇到 <div></div> 标签时,进行推入和弹出操作。

虽然一开始的目标很简单,但我不会感到惊讶,如果不久后你发现自己正在开发一个完整的浏览器。

  • 在屏幕大小限制内重新分页文本
  • 必须处理模态样式和格式标签
  • 必须处理不同大小的嵌入图片,可能还要让文本环绕它们

你没有提到需要支持表格。如果定义了带有 href 的锚标签,这些标签是应该作为可点击的热点吗?如果你需要用 JavaScript 做一些有意义的事情,那可就麻烦了。

在你确定简单的起点时,看看最终产品的需求和期望会有多广泛。如果你开始添加表格、框架、字体和复杂的样式指令,那你基本上就是在重新发明网页浏览器。到那时,试着让讨论回归理智——你只是一个人,写一个浏览器可不是周末能完成的任务。尽量把需求缩减到一组有限的支持标签。或者,可以考虑使用公开的开源浏览器引擎(比如 Chromium),你可能可以根据你简化的功能集进行调整。

撰写回答