Python Selenium仅抓取网页可见数据?TripAdvisor筛选评论抓取异常求助
问题2:TripAdvisor筛选后评论抓取异常的解决方法
这个问题我碰到过不少次——页面看起来已经显示筛选后的结果,但DOM里还留存着筛选前的评论元素,导致你抓错了数据。下面是具体的修复方案:
1. 先等筛选结果完全加载(最关键的一步!)
你输入关键词回车后立刻抓取元素,大概率筛选的AJAX请求还没完成,页面DOM还在更新。必须加入显式等待,确保筛选后的评论区域完全就绪:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 输入关键词并回车后,等待筛选后的评论列表更新 wait = WebDriverWait(driver, 10) # 这里用更精准的条件:等待至少一个可见的筛选后评论出现 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div[data-reviewid]:not([style*='display:none'])")))
2. 筛选出真正可见的评论元素
原来的选择器会选中所有带data-reviewid的元素,包括已经被隐藏的旧评论。你需要在抓取时加上可见性判断:
elements = driver.find_elements_by_css_selector("div[data-reviewid]") for ele in elements: try: # 先判断元素是否可见,再获取ID if ele.is_displayed() and ele.get_attribute("data-reviewid"): print(ele.get_attribute("data-reviewid")) except Exception as e: # 处理可能的元素 stale 异常 print(f"处理元素时出错: {str(e)}")
3. 更高效的CSS选择器写法
你可以直接在CSS选择器里过滤掉隐藏元素,减少循环判断的工作量:
# 只选择没有被 display:none 隐藏的评论元素 visible_reviews = driver.find_elements_by_css_selector("div[data-reviewid]:not([style*='display:none'])") for review in visible_reviews: print(review.get_attribute("data-reviewid"))
为什么你之前用is_displayed()无效?
大概率是因为你没有等待筛选完成就调用了方法——此时旧的评论元素还没被隐藏,新的筛选结果还没完全加载,导致is_displayed()判断的还是旧元素的状态。加上显式等待后就能解决这个问题。
内容的提问来源于stack exchange,提问作者Nikemax
相关产品推荐
相关产品推荐

