如何使用Python爬取包含图片的div,同时提取其中的文本与图片资源
解决方案
.text属性的本质是提取当前节点及所有子节点的纯文本内容,会自动过滤掉所有HTML标签,因此无法直接拿到图片资源。你可以通过遍历目标div下的所有节点,分别处理文本和图片标签的方式实现同时提取:
实现示例(Python + BeautifulSoup4)
这是爬虫场景最常用的实现方案,代码如下:
from bs4 import BeautifulSoup, NavigableString # 替换为你实际拿到的页面HTML内容 html = """ <div class="main"> <span class="something">TEXT1</span> <span class="something">TEXT2</span> <span class="something">TEXT3</span> <span class="something"><img src="示例图片1链接" alt="图片1说明"></span> <span class="something">TEXT4</span> <span class="something">TEXT5</span> <span class="something"><img src="示例图片2链接" alt="图片2说明"></span> <span class="something">TEXT6</span> </div> """ soup = BeautifulSoup(html, 'lxml') # 定位class为main的目标div main_div = soup.find('div', class_='main') # 分别存储提取到的文本和图片 result = { "all_text": [], "all_images": [] } def parse_node(node): # 处理文本节点 if isinstance(node, NavigableString): text_content = node.strip() if text_content: result["all_text"].append(text_content) return # 处理图片标签,提取资源链接 if node.name == 'img': img_info = { "src": node.get("src", ""), "alt": node.get("alt", "") } result["all_images"].append(img_info) return # 其他标签递归遍历子节点 for child in node.children: parse_node(child) parse_node(main_div) # 输出结果 print("提取到的所有文本:", result["all_text"]) print("提取到的所有图片资源:", result["all_images"])
如果你需要保留原DOM顺序混合存储文本和图片,可以修改存储逻辑:
# 按DOM先后顺序混合存储 mixed_result = [] def parse_node_ordered(node): if isinstance(node, NavigableString): text_content = node.strip() if text_content: mixed_result.append({ "type": "text", "content": text_content }) return if node.name == 'img': mixed_result.append({ "type": "image", "src": node.get("src", ""), "alt": node.get("alt", "") }) return for child in node.children: parse_node_ordered(child) parse_node_ordered(main_div) print("按原顺序混合存储结果:", mixed_result)
其他工具的通用思路
如果你使用PyQuery、Selenium、Playwright等其他工具,核心逻辑一致:
- 先定位到目标div节点
- 遍历所有子节点,区分文本节点和元素节点
- 遇到img标签时提取src属性,其他情况提取文本内容
内容的提问来源于stack exchange,提问作者MyDisplay
相关产品推荐
相关产品推荐

