You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python XPath筛选含特定子元素span的div?电商降价商品爬取

解决你的电商爬取问题

嗨,咱们一步步来搞定你的两个需求:

一、用XPath筛选包含特定span子元素的div

这其实是XPath里很常用的节点筛选场景,核心思路是利用XPath的谓语条件来判断父节点是否包含目标子元素:

  • 如果要找直接包含span子元素的div(span是div的直接子节点),用这个表达式:
    //div[span]
    
  • 如果span是div的后代节点(不管嵌套多少层),就改成:
    //div[.//span]
    
  • 要是你需要筛选的是包含特定属性的span(比如带降价标记的span,class为price-drop),可以进一步缩小范围:
    //div[span[@class='price-drop']]
    
    这个表达式会精准匹配所有包含class为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

火山引擎 最新活动