You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python自定义行拆分解析HTML,替代text.splitlines()方法

解决方案:基于DOM结构的HTML行提取

要实现通用的HTML行提取,避免拆分指定标签内容,同时解决嵌套块级元素导致的内容混行问题,可以通过递归遍历DOM树,区分块级元素与需保留整体的行内元素来实现,核心思路是:将块级元素作为行的分隔边界,需保留整体的行内元素(如<td>、<a>)的内容直接作为整体加入当前行,不拆分。

实现代码(Python + BeautifulSoup)

from bs4 import BeautifulSoup, Tag

def extract_html_lines(html_content):
    soup = BeautifulSoup(html_content, 'html.parser')
    # 定义需保留为整体的行内标签(可根据需求扩展)
    preserve_inline_tags = {'td', 'a', 'span', 'strong', 'em'}
    # 定义作为行分隔的块级元素(可根据需求调整)
    block_tags = {'div', 'p', 'tr', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'section'}
    lines = []
    current_line = []

    def traverse_node(node):
        nonlocal current_line
        if isinstance(node, Tag):
            # 处理需保留整体的行内标签:直接提取完整文本加入当前行
            if node.name in preserve_inline_tags:
                current_line.append(node.get_text(strip=False))
                return
            # 处理块级元素:结束当前行,递归遍历子节点
            if node.name in block_tags:
                if current_line:
                    lines.append(''.join(current_line).strip())
                    current_line = []
                for child in node.children:
                    traverse_node(child)
                # 块级元素遍历完成后,收尾当前行
                if current_line:
                    lines.append(''.join(current_line).strip())
                    current_line = []
                return
            # 处理换行标签<br>:直接结束当前行
            if node.name == 'br':
                if current_line:
                    lines.append(''.join(current_line).strip())
                    current_line = []
                return
            # 其他标签:递归遍历子节点
            for child in node.children:
                traverse_node(child)
        else:
            # 处理文本节点:仅保留非空文本
            text = node.strip()
            if text:
                current_line.append(text)
    
    traverse_node(soup)
    # 处理最后一行未收尾的内容
    if current_line:
        lines.append(''.join(current_line).strip())
    # 过滤空行
    return [line for line in lines if line]

代码逻辑说明

  1. 标签分类:明确区分两类标签:需保留整体的行内标签(如<td>、<a>)和作为行分隔的块级元素(如<div>、<tr>)。
  2. 递归遍历:通过递归遍历DOM树,遇到块级元素时就结束当前行,开启新行;遇到需保留整体的行内标签时,直接提取其完整文本(包括内部嵌套的行内元素内容)加入当前行,不拆分。
  3. 文本处理:仅收集非空文本节点,避免空行干扰。

示例验证

假设你的HTML内容如下:

<div>科目1</div>
<div>
    <div>科目2</div>
    <div>科目3</div>
    <div>科目4</div>
    <div>科目5</div>
</div>
<table>
    <tr>
        <td>语文 <a href="#">必修一</a></td>
        <td>数学 <strong>选修二</strong></td>
    </tr>
</table>

调用函数后得到的行列表为:

['科目1', '科目2', '科目3', '科目4', '科目5', '语文 必修一', '数学 选修二']

完全解决了嵌套<div>导致的内容混行问题,同时<td>、<a>的内容被完整保留为单行。

自定义调整

  • 如果需要将<tr>内的所有<td>内容合并为一行,可将'tr'从block_tags中移除,这样<tr>会被当作普通容器,内部的<td>内容会被合并到同一行。
  • 可根据实际HTML结构,扩展preserve_inline_tags或block_tags的标签列表,适配更多场景。

内容的提问来源于stack exchange,提问作者sameer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 09:27:53