如何用Python XPath筛选含特定子元素span的div?电商降价商品爬取
解决你的电商爬取问题
嗨,咱们一步步来搞定你的两个需求:
一、用XPath筛选包含特定span子元素的div
这其实是XPath里很常用的节点筛选场景,核心思路是利用XPath的谓语条件来判断父节点是否包含目标子元素:
- 如果要找直接包含span子元素的div(span是div的直接子节点),用这个表达式:
//div[span] - 如果span是div的后代节点(不管嵌套多少层),就改成:
//div[.//span] - 要是你需要筛选的是包含特定属性的span(比如带降价标记的span,class为
price-drop),可以进一步缩小范围:
这个表达式会精准匹配所有包含class为//div[span[@class='price-drop']]price-drop的span的div节点,完全符合你筛选降价商品的需求。
二、完善你的降价商品爬取代码框架
我把你的代码框架补全了,加入了请求头、异常处理,还有针对降价商品的XPath筛选逻辑,你可以根据目标网站的实际HTML结构调整对应的XPath表达式:
from lxml import html import requests class CategoryCrawler(object): def __init__(self, base_url): self.base_url = base_url # 模拟浏览器请求头,避免被网站反爬拦截 self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } def crawl(self): try: # 发送HTTP请求获取页面内容 response = requests.get(self.base_url, headers=self.headers) response.raise_for_status() # 自动抛出请求失败的异常 # 解析HTML页面 tree = html.fromstring(response.content) # 核心:用XPath筛选出包含降价标记span的商品div(这里假设降价span的class是"price-reduced",需根据实际网站修改) product_divs = tree.xpath("//div[span[@class='price-reduced']]") # 遍历每个降价商品,提取所需信息 for product in product_divs: # 提取商品名称(XPath需匹配目标网站的元素结构) product_name = product.xpath(".//h3[@class='product-title']/text()")[0].strip() if product.xpath(".//h3[@class='product-title']/text()") else "未获取到名称" # 提取当前价格 current_price = product.xpath(".//span[@class='current-price']/text()")[0].strip() if product.xpath(".//span[@class='current-price']/text()") else "未获取到价格" # 提取颜色信息 color = product.xpath(".//div[@class='product-color']/text()")[0].strip() if product.xpath(".//div[@class='product-color']/text()") else "未获取到颜色" # 提取尺码信息 size = product.xpath(".//div[@class='product-size']/text()")[0].strip() if product.xpath(".//div[@class='product-size']/text()") else "未获取到尺码" # 打印或保存信息 print(f"【降价商品】") print(f"名称:{product_name}") print(f"价格:{current_price}") print(f"颜色:{color}") print(f"尺码:{size}") print("------------------------") except requests.exceptions.RequestException as e: print(f"请求过程出错:{str(e)}") except IndexError: print("解析页面时,某个字段不存在,请检查XPath表达式是否匹配网站结构") except Exception as e: print(f"未知错误:{str(e)}") # 实例化爬虫并启动 crawler = CategoryCrawler('https://www.myfavoriteecommercesite.com/') crawler.crawl()
代码关键点说明:
- 请求头:模拟浏览器访问,大部分电商网站会拦截无标识的爬虫请求,这一步很重要
- XPath筛选逻辑:用
//div[span[@class='price-reduced']]精准定位降价商品容器,你需要把price-reduced改成目标网站实际的降价span的class或其他属性 - 容错处理:每个字段提取时都做了存在性判断,避免因为某个字段缺失导致程序崩溃
- 异常捕获:覆盖了请求错误、解析错误等常见场景,方便排查问题
内容的提问来源于stack exchange,提问作者Mr Ofu




