在进行网页级信息提取时,理解HTML 的语义标签是第一步。核心要素包括
同时,DOM 结构的层级关系决定了信息的定位路径。掌握父子、兄弟节点的关系,有助于快速定位正文、作者、日期等字段。
from bs4 import BeautifulSoup
import requestsurl = 'https://example.com'
headers = {'User-Agent': 'Mozilla/5.0'}
resp = requests.get(url, headers=headers, timeout=10)
html = resp.textsoup = BeautifulSoup(html, 'lxml')
# 定位标题和描述的示例
title = soup.title.string.strip() if soup.title else ''
desc_meta = soup.find('meta', attrs={'name': 'description'})
description = desc_meta['content'].strip() if desc_meta and desc_meta.get('content') else ''
print(title, description)
标题、描述等字段往往是快速判断页面主题的首要信息,优先从这些字段提取能显著提升后续分析的准确性。
在抓取网页时,请求头的设计、编码处理以及对异常的稳健处理,是确保数据质量的基础。合理设置超时、重试和应对压缩内容,可以降低请求失败的概率。
示例代码段展示了从网络获取 HTML,并为后续解析做准备的基本流程。
import requests
from bs4 import BeautifulSoupurl = 'https://example.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
}
resp = requests.get(url, headers=headers, timeout=12)
resp.raise_for_status()
html = resp.content.decode(resp.encoding or 'utf-8', errors='replace')
soup = BeautifulSoup(html, 'lxml')
通过这段代码,可以确保网页获取阶段的鲁棒性,为后续的文本提取打下稳定的基础。
解析阶段要处理冗余信息并尽量保留有用文本。使用get_text结合正则清洗,可以获得较干净的正文文本。
from bs4 import BeautifulSoup
import resoup = BeautifulSoup(html, 'lxml')
article = soup.find('article') or soup.find('div', class_='content') or soup.body
text = article.get_text(separator=' ', strip=True) if article else soup.get_text(separator=' ', strip=True)
text = re.sub(r'\s+', ' ', text).strip()
print(text[:200] + '...')
这一阶段的目标是将HTML 的结构化文本转换为可分析的连续文本,并去除噪声以提升后续处理效果。
实战中,优先定位正文区域非常关键。常见做法是先定位
、带有 content 类名的容器,或者 标签,再从中提取段落文本。为了提高准确性,需过滤掉导航、广告、脚注等无关区域,确保输出文本的可读性。
def extract_body_text(soup):container = soup.find('article') or soup.find('div', class_='content') or soup.find('main')if container:parts = []for p in container.find_all(['p']):t = p.get_text(separator=' ', strip=True)if t:parts.append(t)return '\n'.join(parts)return soup.get_text(separator='\n', strip=True)text = extract_body_text(soup) print(text[:500])
通过这样的策略,可以将页面结构中的关键信息转化成可逐段分析的文本,便于后续的语义处理和索引。
除了正文,标题、描述、发布日期、作者等字段往往承担索引和摘要的核心作用。系统化地提取这些字段,可以形成结构化的数据输出。
def extract_meta(soup):title = soup.title.string.strip() if soup.title else ''description = ''m = soup.find('meta', attrs={'name': 'description'}) or soup.find('meta', attrs={'property': 'og:description'})if m and m.get('content'):description = m['content'].strip()author = ''author_tag = soup.find(attrs={'name': 'author'}) or soup.find(class_='author')if author_tag:author = author_tag.get_text(strip=True)date = ''date_tag = soup.find(attrs={'property': 'article:published_time'}) or soup.find(class_='date')if date_tag and date_tag.get('content'):date = date_tag['content'].strip()return {'title': title, 'description': description, 'author': author, 'date': date}
将这些字段整合,可以快速得到一个结构化的摘要信息集合,方便后续索引、检索与整合展示。
对于需要JavaScript 渲染的页面,单纯的请求库往往无法获得渲染后的完整内容。这时可以使用
from selenium import webdriverdriver = webdriver.Chrome()
driver.get('https://example.com')
rendered_html = driver.page_source
driver.quit()from bs4 import BeautifulSoup
soup = BeautifulSoup(rendered_html, 'lxml')
text = extract_body_text(soup)
请注意动态内容的加载顺序与等待条件,确保获取到关键文本后再进行解析。
在高并发场景中,请求缓存和速率限制是常用的性能与礼仪控制手段。通过缓存可以显著提升批量提取的效率,并降低对目标站点的压力。
import requests_cache import requestsrequests_cache.install_cache('web_cache', backend='sqlite', expire_after=3600) resp = requests.get('https://example.com', timeout=10) print('From cache:', getattr(resp, 'from_cache', False))
结合缓存策略,可以实现大规模页面的稳定提取,同时便于后续对比分析页面变更。
在将结构化文本交给语言模型进行摘要或提炼时,可以通过设置temperature参数来控制输出的创造性与一致性。如果需要获得稳定而不过于迂腐的摘要,可以考虑将该参数设为temperature=0.6,以平衡多样性与可控性。
import openaiprompt = “请对以下网页文本进行简要摘要:\n” + text response = openai.ChatCompletion.create(model=“gpt-4”,messages=[{“role”: “user”, “content”: prompt}],temperature=0.6,max_tokens=200 ) summary = response.choices[0].message[‘content’].strip() print(summary)
通过将提取出的文本交给语言模型进行二次处理,能够得到更易于阅读和分发的摘要结果。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/258845.html