`beautifulsoup4`(简称 BeautifulSoup)是 Python 中最常用、最强大的 HTML 和 XML 解析库之一
beautifulsoup4(简称 BeautifulSoup)是 Python 中最常用、最强大的 HTML 和 XML 解析库之一,专为从网页中提取结构化数据而设计。它不直接发起网络请求,通常与requests库配合使用:requests获取网页源码,BeautifulSoup解析并导航 DOM 树。
✅ 基本用法示例:
importrequestsfrombs4importBeautifulSoup url="https://example.com"response=requests.get(url)response.raise_for_status()# 检查请求是否成功soup=BeautifulSoup(response.text,'html.parser')# 推荐使用 'html.parser'(内置,无需额外安装)# 提取标题title=soup.title.stringifsoup.titleelseNone# 查找所有链接links=[a.get('href')forainsoup.find_all('a',href=True)]# 使用 CSS 选择器(更简洁)headings=soup.select('h1, h2, h3')# 查找带特定 class 的 divcontent=soup.find('div',class_='main-content')⚠️ 注意事项:
- 解析器选择:
'html.parser'(轻量、稳定)、'lxml'(更快更容错,需pip install lxml)、'html5lib'(最接近浏览器解析,需pip install html5lib)。 - 中文乱码问题:若网页编码非 UTF-8,需显式指定
response.content+soup = BeautifulSoup(response.content, 'html.parser', from_encoding='gbk')或使用response.encoding自动识别。 - 动态渲染内容(如 JS 生成的 DOM)无法被 BeautifulSoup 直接解析,需配合
Selenium或Playwright。
✅ 安装命令:
pipinstallbeautifulsoup4 requests使用 BeautifulSoup 提取网页中所有图片的src属性并去重,可按以下步骤实现:
✅ 正确做法(含健壮性处理):
importrequestsfrombs4importBeautifulSoupdefextract_unique_img_srcs(url):try:response=requests.get(url,timeout=10)response.raise_for_status()response.encoding=response.apparent_encoding# 自动识别编码,避免乱码soup=BeautifulSoup(response.text,'html.parser')# 查找所有 <img> 标签,并提取 src 属性(过滤空值和无效值)srcs=[]forimginsoup.find_all('img',src=True):# 只匹配有 src 属性的 img 标签src=img.get('src','').strip()ifsrcandnotsrc.startswith('data:'):# 可选:跳过 base64 内联图片# 处理相对 URL(转换为绝对 URL)fromurllib.parseimporturljoin absolute_src=urljoin(url,src)srcs.append(absolute_src)# 去重(保持出现顺序)→ 使用 dict.fromkeys() 是 Python 3.7+ 保持插入顺序的最简方式unique_srcs=list(dict.fromkeys(srcs))returnunique_srcsexceptExceptionase:print(f"解析失败:{e}")return[]# 示例调用urls=extract_unique_img_srcs("https://example.com")print(f"共提取{len(urls)}个唯一图片链接:")fori,srcinenumerate(urls[:5],1):# 打印前5个示例print(f"{i}.{src}")💡 补充说明:
img.get('src', '')比直接访问img['src']更安全(避免 KeyError);urljoin(url, src)自动处理相对路径(如/images/logo.png或../assets/icon.jpg),生成完整 URL;- 过滤
data:开头的 base64 图片可根据需求保留或剔除; - 若需进一步去重(忽略查询参数差异,如
?v=1.2),可用urllib.parse.urlparse标准化后再去重。
