如何抓取点击按钮后加载的联系电话及无class的咨询费文本?
网页抓取问题解决方案
问题1:点击按钮后才显示的联系电话抓取
问题原因
你当前用BeautifulSoup只能获取页面初始加载的静态HTML内容,联系电话是点击「CALL NOW」按钮后通过JS动态请求/渲染的内容,不在初始HTML里,所以静态抓取无法拿到数据。
可选解决方案
- 方案1:抓后端接口
打开浏览器F12开发者工具,切换到「网络」面板,点击「CALL NOW」按钮,筛选触发的新请求,找到返回手机号码的接口,直接模拟请求该接口获取数据,性能远高于模拟浏览器。 - 方案2:模拟浏览器动态渲染
使用Selenium、Playwright等无头浏览器工具,模拟点击按钮后等待元素加载再取值,示例代码如下:
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 = webdriver.Chrome() driver.get("目标URL") # 模拟点击CALL NOW按钮 driver.find_element(By.XPATH, '//button[text()="CALL NOW"]').click() # 最多等待10秒,直到号码元素加载完成 try: contact_ele = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'c-vn-full__number u-bold')) ) contact = contact_ele.text.strip() except: contact = "N/A"
问题2:无class属性的咨询费(Price)文本提取
没有class属性时可以通过以下几种常用方式定位元素:
- XPATH相对定位:依托固定的相邻元素定位,比如价格字段前的文本是固定的「咨询费(Price)」,如果HTML结构为
<span>咨询费(Price)</span><span>¥300/次</span>,可以用如下XPATH直接定位价格元素://span[text()="咨询费(Price)"]/following-sibling::span[1],BeautifulSoup也可以用find的next_sibling方法实现同样逻辑。 - 位置索引定位:如果价格元素在父标签下的顺序固定,先定位到父元素,再提取对应位置的子元素文本即可,示例:
parent_node.find_all('p')[2].text.strip()(取父元素下第3个p标签的文本)。 - 正则特征匹配:如果价格有统一格式特征(如带¥符号、数字+单位结构),可以先提取父级区域的全部文本,再用正则匹配符合格式的价格内容。
内容的提问来源于stack exchange,提问作者Techsearch
相关产品推荐
相关产品推荐

