在爬虫和网页处理任务中,清理和优化 HTML 内容是至关重要的。通过提取重要信息、删除冗余数据和压缩 HTML,可以显著减少带宽使用,提升处理效率。本文将介绍一个使用 BeautifulSoup 和 minify_html 库来处理 HTML 内容的实用函数。
函数介绍
这个函数 cleanup_html 的主要功能是:
- 提取网页标题:获取网页的
<title>标签内容。 - 删除不必要的标签:移除所有
<script>和<style>标签,减少无用信息。 - 提取链接和图片:提取网页中的所有链接和图片地址,并处理相对路径,使其变成完整的 URL。
- 压缩 HTML 内容:使用
minify_html库压缩<body>标签内的 HTML 内容,减小 HTML 大小。 - 返回处理结果:返回处理后的标题、压缩后的
<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 内容,并返回有用的信息。这种方法特别适用于需要处理大量网页数据并且带宽受限的场景。希望这个函数能为大家在实际项目中提供帮助!