You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python+Selenium的CSS选择器定位兄弟元素并抓取公寓价格?

问题

尝试从OLX乌兹别克斯坦站的塔什坎特长租公寓列表页抓取公寓价格,无法获取显示为700 y.e.的价格内容,希望用CSS选择器实现定位,现有Python代码如下:

def get_content(url):
    with webdriver.Chrome() as driver:
        driver.get(url)
        grid = driver.find_element(By.CSS_SELECTOR, 'div[data-testid="listing-grid"]')
        cards = [x for x in grid.find_elements(By.CSS_SELECTOR, 'div[data-cy="l-card"]') if 'ТОП' not in x.text]
        links = []
        prices = []
        for card in cards:
            url = card.find_element(By.TAG_NAME, 'a').get_attribute('href')
            links.append(url)
            price = card.find_element(By.CSS_SELECTOR, 'p[data-testid="ad-price"]').text
            print(f'the price is {price}')
解决方案

从DOM结构来看,700 y.e.可能位于p[data-testid="ad-price"]的子元素中,或者当前读取方式无法获取到实际文本,可尝试以下几种方法:

  • 精准定位子元素:检查DOM细节,若价格文本在span等子标签内,修改CSS选择器为p[data-testid="ad-price"] > span,直接获取子元素的文本内容。
  • 读取textContent属性:部分元素的文本无法通过.text读取,改用get_attribute('textContent')获取完整文本:
    price = card.find_element(By.CSS_SELECTOR, 'p[data-testid="ad-price"]').get_attribute('textContent').strip()
    
  • 添加显式等待:页面可能存在动态加载,添加等待逻辑确保元素完全渲染后再读取,避免因元素未加载导致的读取失败。

优化后的代码示例:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def get_content(url):
    with webdriver.Chrome() as driver:
        driver.get(url)
        # 等待列表网格加载完成
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, 'div[data-testid="listing-grid"]'))
        )
        grid = driver.find_element(By.CSS_SELECTOR, 'div[data-testid="listing-grid"]')
        cards = grid.find_elements(By.CSS_SELECTOR, 'div[data-cy="l-card"]')
        links = []
        prices = []
        for card in cards:
            if 'ТОП' in card.text:
                continue
            card_link = card.find_element(By.TAG_NAME, 'a').get_attribute('href')
            links.append(card_link)
            # 获取价格文本
            price_elem = card.find_element(By.CSS_SELECTOR, 'p[data-testid="ad-price"]')
            price = price_elem.get_attribute('textContent').strip()
            print(f'the price is {price}')

内容的提问来源于stack exchange,提问作者Evgenslam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:31:15