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

Python Selenium爬取Yelp商家信息:弹窗内容提取问题求助

解决Yelp商家"About the Business"弹窗内容提取问题

嘿,刚接触Selenium爬取很正常,别担心!你遇到的问题核心是:那个"Read More"弹出的不是新浏览器窗口,而是页面内的模态弹窗(Modal),所以window_handles不会新增,自然找不到新窗口句柄。下面给你针对性的解决方案:

关键思路

Yelp的这个弹窗是嵌入在当前页面DOM结构里的,不需要切换窗口,只需要等待弹窗加载完成后,直接定位弹窗内的元素即可。我们可以用Selenium的显式等待来确保元素加载完毕,避免因页面加载慢导致的定位失败。

修改后的代码示例

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化driver(根据你的浏览器调整,比如Chrome)
driver = webdriver.Chrome()
driver.get("https://www.yelp.com/biz/and-pizza-bethesda-bethesda")

try:
    # 精准定位"About the Business"板块(用h2文本定位更可靠)
    about_section = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "//section[.//h2[text()='About the Business']]"))
    )
    
    # 检查是否存在"Read More"按钮
    read_more_btn = about_section.find_elements(By.TAG_NAME, "button")
    if read_more_btn:
        read_more_btn[0].click()
        
        # 等待弹窗加载完成,定位弹窗容器
        about_popup = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "modal-container__09f24__HB9s4"))
        )
        
        # 提取弹窗内的文本内容
        popup_text = about_popup.find_element(By.TAG_NAME, "p").text
        print("About the Business (弹窗版):")
        print(popup_text)
        
        # 关闭弹窗(通过aria-label定位关闭按钮)
        close_btn = about_popup.find_element(By.XPATH, "//button[contains(@aria-label, 'Close')]")
        close_btn.click()
    else:
        # 无弹窗场景,直接提取板块内的文本
        about_text = about_section.find_element(By.TAG_NAME, "p").text
        print("About the Business (直接显示版):")
        print(about_text)
        
finally:
    driver.quit()

代码细节解释

  • 显式等待:用WebDriverWait替代直接查找元素,确保目标元素加载完成后再执行操作,避免常见的NoSuchElementException。
  • 模态框定位:通过弹窗的专属类名定位弹窗容器,如果后续Yelp更新类名,也可以用更通用的XPATH//div[contains(@class, 'modal')]来定位。
  • 双场景兼容:先判断是否存在"Read More"按钮,分别处理弹窗展示和直接展示的两种商家页面情况。

额外小提示

  • 如果遇到Yelp的反爬验证(比如验证码),可以尝试更换User-Agent、添加短时间等待(尽量少用time.sleep(),优先用显式等待),或者使用代理IP。
  • 元素定位可以灵活调整,比如用XPATH定位板块时,//section[.//h2[text()='About the Business']]比依赖文本开头匹配更稳定,避免因页面空格导致的定位失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:32:35