如何按特定HTML标题标签分割文本内容?
需求实现方案
问题说明
需要将一段HTML文本按固定格式的标题分割,标题以<p><strong>开头、</strong></p>结尾,提取每两个标题之间的内容(包括第一个标题后到第二个标题前的内容),最终输出为数组形式。
示例输入
<p><strong>Omnis officiis qui hic mollitia<br /><br /></strong></p> <p><span style="font-weight: 400;">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Odit mollitia cupiditate ab eaque exercitationem. Omnis officiis qui hic mollitia molestiae eveniet porro ducimus sint? Sint sapiente quibusdam alias dolor a voluptatem, minus velit placeat fugit. Eum nulla omnis eaque dicta!</span></p> <p><strong>Quibusdam alias dolor a</strong></p> <p><span style="font-weight: 400;">Hic mollitia molestiae eveniet porro ducimus sint? Sint sapiente quibusdam alias dolor a voluptatem, minus velit placeat fugit. Eum nulla omnis eaque dicta!</span></p> <ul><li style="font-weight: 400;">Ducimus sint</li><li style="font-weight: 400;">Ducimus sint</li><li style="font-weight: 400;">Ducimus sint</li><li style="font-weight: 400;">Ducimus sint</li></ul> <p><strong>Lorem ipsum dolor sit amet</strong></p> <p><span style="font-weight: 400;">Assumenda aspernatur sit, cumque autem in suscipit laudantium natus, dolore, non molestiae optio alias reiciendis cum. Asperiores autem doloribus repellendus minima eaque? Earum iure inventore minima soluta ex vitae nostrum, aut nulla enim maxime rerum doloremque aperiam commodi! Numquam, nemo commodi! Consequuntur nulla sint dolorem itaque eveniet veritatis repellat? Saepe dignissimos esse vero? Impedit reprehenderit officiis beatae blanditiis</span></p>
期望输出
[ 0: "<p><span style=\"font-weight: 400;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Odit mollitia cupiditate ab eaque exercitationem. Omnis officiis qui hic mollitia molestiae eveniet porro ducimus sint? Sint sapiente quibusdam alias dolor a voluptatem, minus velit placeat fugit. Eum nulla omnis eaque dicta!</span></p>", 1: "<p><span style=\"font-weight: 400;\">Hic mollitia molestiae eveniet porro ducimus sint? Sint sapiente quibusdam alias dolor a voluptatem, minus velit placeat fugit. Eum nulla omnis eaque dicta!</span></p><ul><li style=\"font-weight: 400;\">Ducimus sint</li><li style=\"font-weight: 400;\">Ducimus sint</li><li style=\"font-weight: 400;\">Ducimus sint</li><li style=\"font-weight: 400;\">Ducimus sint</li></ul>", 2: "<p><span style=\"font-weight: 400;\">Assumenda aspernatur sit, cumque autem in suscipit laudantium natus, dolore, non molestiae optio alias reiciendis cum. Asperiores autem doloribus repellendus minima eaque? Earum iure inventore minima soluta ex vitae nostrum, aut nulla enim maxime rerum doloremque aperiam commodi! Numquam, nemo commodi! Consequuntur nulla sint dolorem itaque eveniet veritatis repellat? Saepe dignissimos esse vero? Impedit reprehenderit officiis beatae blanditiis</span></p>" ]
实现方案
Python 版本
利用正则表达式匹配标题作为分隔符,分割后过滤无效内容并格式化输出:
import re # 输入的HTML文本 html_content = """ <p><strong>Omnis officiis qui hic mollitia<br /><br /></strong></p> <p><span style="font-weight: 400;">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Odit mollitia cupiditate ab eaque exercitationem. Omnis officiis qui hic mollitia molestiae eveniet porro ducimus sint? Sint sapiente quibusdam alias dolor a voluptatem, minus velit placeat fugit. Eum nulla omnis eaque dicta!</span></p> <p><strong>Quibusdam alias dolor a</strong></p> <p><span style="font-weight: 400;">Hic mollitia molestiae eveniet porro ducimus sint? Sint sapiente quibusdam alias dolor a voluptatem, minus velit placeat fugit. Eum nulla omnis eaque dicta!</span></p> <ul><li style="font-weight: 400;">Ducimus sint</li><li style="font-weight: 400;">Ducimus sint</li><li style="font-weight: 400;">Ducimus sint</li><li style="font-weight: 400;">Ducimus sint</li></ul> <p><strong>Lorem ipsum dolor sit amet</strong></p> <p><span style="font-weight: 400;">Assumenda aspernatur sit, cumque autem in suscipit laudantium natus, dolore, non molestiae optio alias reiciendis cum. Asperiores autem doloribus repellendus minima eaque? Earum iure inventore minima soluta ex vitae nostrum, aut nulla enim maxime rerum doloremque aperiam commodi! Numquam, nemo commodi! Consequuntur nulla sint dolorem itaque eveniet veritatis repellat? Saepe dignissimos esse vero? Impedit reprehenderit officiis beatae blanditiis</span></p> """ # 匹配标题的正则,非贪婪匹配避免跨标题,re.DOTALL让.匹配换行符 title_match = re.compile(r'<p><strong>.*?</strong></p>', re.DOTALL) # 按标题分割文本 split_parts = title_match.split(html_content) # 过滤空内容,去除多余换行和空格,转义双引号 processed_content = [ part.strip().replace('\n', '').replace('"', '\\"') for part in split_parts if part.strip() ] # 输出目标数组格式 print("[") for index, content in enumerate(processed_content): print(f" {index}: \"{content}\",") print("]")
JavaScript 版本
用正则分割后处理空白和转义,实现相同效果:
const htmlContent = ` <p><strong>Omnis officiis qui hic mollitia<br /><br /></strong></p> <p><span style="font-weight: 400;">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Odit mollitia cupiditate ab eaque exercitationem. Omnis officiis qui hic mollitia molestiae eveniet porro ducimus sint? Sint sapiente quibusdam alias dolor a voluptatem, minus velit placeat fugit. Eum nulla omnis eaque dicta!</span></p> <p><strong>Quibusdam alias dolor a</strong></p> <p><span style="font-weight: 400;">Hic mollitia molestiae eveniet porro ducimus sint? Sint sapiente quibusdam alias dolor a voluptatem, minus velit placeat fugit. Eum nulla omnis eaque dicta!</span></p> <ul><li style="font-weight: 400;">Ducimus sint</li><li style="font-weight: 400;">Ducimus sint</li><li style="font-weight: 400;">Ducimus sint</li><li style="font-weight: 400;">Ducimus sint</li></ul> <p><strong>Lorem ipsum dolor sit amet</strong></p> <p><span style="font-weight: 400;">Assumenda aspernatur sit, cumque autem in suscipit laudantium natus, dolore, non molestiae optio alias reiciendis cum. Asperiores autem doloribus repellendus minima eaque? Earum iure inventore minima soluta ex vitae nostrum, aut nulla enim maxime rerum doloremque aperiam commodi! Numquam, nemo commodi! Consequuntur nulla sint dolorem itaque eveniet veritatis repellat? Saepe dignissimos esse vero? Impedit reprehenderit officiis beatae blanditiis</span></p> `; // 匹配标题的正则,s修饰符让.匹配换行 const titleRegex = /<p><strong>.*?<\/strong><\/p>/gs; // 分割文本 const splitParts = htmlContent.split(titleRegex); // 处理内容:去空白、转义引号、过滤空值 const processedContent = splitParts .map(part => part.trim().replace(/\n+/g, '').replace(/"/g, '\\"')) .filter(part => part.length > 0); // 输出目标格式 console.log('['); processedContent.forEach((content, idx) => { console.log(` ${idx}: "${content}",`); }); console.log(']');
注意事项
- 正则使用
.*?非贪婪匹配,确保每个标题只匹配自身,不会跨多个标题 - 分割后要过滤空字符串,避免标题前后的空白被当成有效内容
- 转义双引号是为了保证输出的字符串符合语法规范
内容的提问来源于stack exchange,提问作者tommilee
相关产品推荐
相关产品推荐

