我正在使用 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 大小?
如果您想清理结果甚至只是发送文本,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]