使用 BeautifulSoup 减少客户端 DOM + HTML 大小

问题描述 投票:0回答:1

我正在使用 Playwright(一个网络抓取和测试库)来导航网页,但在使用 Playwright 的操作之前,我想最小化从网页获取的 DOM。

我这样做的原因是因为我正在通过将某些东西发送到 GPT-4 API 来进行试验,并且我试图满足 4,000 个令牌以下的令牌限制。所以 HTML 越最小化越好。

这是我正在使用的代码。目前,它删除了不必要的标签、注释、属性(必要的除外)和空格。它通常能够减少 DOM 大小约 30-40%,具体取决于所提供的网页。

def minimize_html(html_content):
    soup = BeautifulSoup(html_content, 'html.parser')

    # Remove unnecessary tags
    for tag in soup.find_all(['style', 'script', 'meta', 'link']):
        tag.decompose()

    # Remove comments
    for element in soup(text=lambda text: isinstance(text, Comment)):
        element.extract()

    # Remove attributes except for form-related elements and href
    for tag in soup.find_all(True):
        if tag.name not in ['form', 'input', 'select', 'textarea', 'button', 'a']:
            tag.attrs = {}
        else:
            if tag.name == 'a':
                href = tag.attrs.get('href')
                tag.attrs = {'href': href} if href else {}

    # Minify HTML by removing whitespace
    clean_content = str(soup).replace('\n', '').replace('\r', '').strip()

    return clean_content

我的问题是,还有什么我可以删除的吗?我的其他一些想法是剪切超过 200 个字符的文本,以进一步减小文本较多的网页上的 DOM 大小。

或者,有没有更好的方法来减少客户端的 DOM 大小?

html web-scraping dom beautifulsoup
1个回答
0
投票

如果您想清理结果甚至只是发送文本,Trafilatura 是您的朋友。

使用现有方法最小化 HTML 后,您可以使用 Trafilatura 提取主要内容:

import trafilatura

def extract_text_from_html(clean_content):
    extracted_text = trafilatura.extract(clean_content)
    return extracted_text if extracted_text else clean_content

通过使用 Trafilatura,您可以专注于提取页面的主要内容,通常不包括导航、页脚、侧边栏和网页的其他非必要部分(使用 Mozilla 的可读性 API)。这可以显着减小您正在使用的内容的大小,尤其是在文本较多的网页上。(或具有大量 div 的页面)

您还可以使用 HTML 缩小器(如 htmlmin)来进一步缩小代码响应。

您还可以删除空元素:

for tag in soup.find_all(True):
    if not tag.text.strip():
        tag.decompose()

您还可以缩短某些标签而不是其他标签文本/截断的长度:

for tag in soup.find_all(['p', 'div', 'span', 'h1', 'h2', 'h3', 'h4', 'h5', 'etc']):
    if len(tag.text) > 200:
        tag.string = tag.text[:200]
© www.soinside.com 2019 - 2024. All rights reserved.