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

