如何用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
相关产品推荐
相关产品推荐

