Python Selenium爬虫检测div标签data-asin空值及嵌套属性值的方法
Selenium + BeautifulSoup 提取有效data-asin属性实现方案
前置步骤:获取可解析的页面源码
首先用Selenium加载目标页面,拿到完整渲染后的HTML内容,初始化BeautifulSoup对象:
from bs4 import BeautifulSoup from selenium import webdriver # 初始化浏览器驱动 driver = webdriver.Chrome() driver.get("目标爬取页面URL") # 可选:设置隐式等待,避免页面未完全加载就抓取 driver.implicitly_wait(10) # 生成BeautifulSoup解析对象 soup = BeautifulSoup(driver.page_source, "html.parser") driver.quit()
核心提取逻辑
你提供的HTML特征里,所有需要校验的外层节点统一具备data-cel-widget属性以search_result_开头、带data-index属性的特征,先批量选出这类顶层节点,再按两层逻辑处理:
- 先读取外层div的
data-asin属性,若非空直接记录 - 若外层
data-asin为空,自动遍历该节点下所有嵌套层级,提取所有非空的data-asin属性值
# 批量选中所有待校验的顶层div节点 top_result_divs = soup.select('div[data-cel-widget^="search_result_"]') valid_asin = [] for div in top_result_divs: # 读取外层div的data-asin属性 outer_asin = div.get("data-asin") # 外层属性非空则直接记录,无需遍历子元素 if outer_asin and outer_asin.strip(): valid_asin.append(outer_asin) continue # 外层属性为空,查找当前节点下所有带data-asin属性的子元素 child_asin_nodes = div.select('[data-asin]') for node in child_asin_nodes: child_asin = node.get("data-asin") # 过滤空属性值 if child_asin and child_asin.strip(): valid_asin.append(child_asin)
场景匹配说明
针对你给出的data-index="2"空ASIN外层节点场景:
- 程序识别到外层
data-asin为空后,会自动穿透3层嵌套结构,找到内部带data-asin="0974158216"、data-asin="1433692163"的子div - 不会把空的
data-asin值、无data-asin属性的节点误记录
可选优化:结果去重
如果遇到重复出现的ASIN,需要去重同时保留原始遍历顺序,可增加如下逻辑:
seen = set() unique_asin_list = [] for asin in valid_asin: if asin not in seen: seen.add(asin) unique_asin_list.append(asin)
实现说明
- 不需要额外写try/except逻辑:BeautifulSoup的
get()方法读取不存在的属性时会返回None,不会触发异常 - 不需要手动写递归遍历嵌套结构:CSS选择器会自动匹配当前节点下所有层级的目标元素,不会因为HTML嵌套深度变化失效
内容的提问来源于stack exchange,提问作者econnoob5
相关产品推荐
相关产品推荐

