使用 BeautifulSoup 和 minify_html 去除不必要的标签,压缩HTML

294 阅读2分钟

在爬虫和网页处理任务中,清理和优化 HTML 内容是至关重要的。通过提取重要信息、删除冗余数据和压缩 HTML,可以显著减少带宽使用,提升处理效率。本文将介绍一个使用 BeautifulSoup 和 minify_html 库来处理 HTML 内容的实用函数。

函数介绍

这个函数 cleanup_html 的主要功能是:

  1. 提取网页标题:获取网页的 <title> 标签内容。
  2. 删除不必要的标签:移除所有 <script><style> 标签,减少无用信息。
  3. 提取链接和图片:提取网页中的所有链接和图片地址,并处理相对路径,使其变成完整的 URL。
  4. 压缩 HTML 内容:使用 minify_html 库压缩 <body> 标签内的 HTML 内容,减小 HTML 大小。
  5. 返回处理结果:返回处理后的标题、压缩后的 <body> 内容以及提取的链接和图片地址。

代码实现

以下是 cleanup_html 函数的代码实现:

from bs4 import BeautifulSoup
from minify_html import minify
from urllib.parse import urljoin

def cleanup_html(html_content: str, base_url: str) -> str:
    """
    处理HTML内容,通过去除不必要的标签,压缩HTML,提取标题和主体内容。

    参数:
        html_content (str): 要处理的HTML内容。
        base_url (str): 用于处理相对路径的基准URL。

    返回:
        tuple: 包含解析出的标题、压缩后的主体内容、提取的链接列表和图片列表。如果没有找到主体内容,则抛出异常。
    """

    soup = BeautifulSoup(html_content, 'html.parser')

    # 标题提取
    title_tag = soup.find('title')
    title = title_tag.get_text() if title_tag else ""

    # 移除script和style标签
    for tag in soup.find_all(['script', 'style']):
        tag.extract()

    # 链接提取
    links = soup.find_all('a')
    link_urls = []
    for link in links:
        if 'href' in link.attrs:
            link_urls.append(urljoin(base_url, link['href']))

    # 图片提取
    images = soup.find_all('img')
    image_urls = []
    for image in images:
        if 'src' in image.attrs:
            # 如果图片url中不包含http或https,则将其与基准URL拼接
            if 'http' not in image['src']:
                image_urls.append(urljoin(base_url, image['src']))
            else:
                image_urls.append(image['src'])

    # 提取主体内容(如果存在)
    body_content = soup.find('body')
    if body_content:
        # 压缩body标签内的HTML
        minimized_body = minify(str(body_content))
        return title, minimized_body, link_urls, image_urls

if __name__ == '__main__':
    html_content = "<html><head><title>示例</title></head><body><p>你好,世界!</p></body></html>"
    print(cleanup_html(html_content, "http://example.com"))

运行示例

运行以上代码,输出结果如下:

('示例', '<body><p>你好,世界!</p></body>', [], [])

总结

在处理网页数据的过程中,清理和优化 HTML 内容是提高效率的关键步骤。本文介绍的 cleanup_html 函数通过使用 BeautifulSoup 和 minify_html 库,能够有效地提取网页标题、删除不必要的标签、处理相对路径、压缩 HTML 内容,并返回有用的信息。这种方法特别适用于需要处理大量网页数据并且带宽受限的场景。希望这个函数能为大家在实际项目中提供帮助!