使用Beautiful Soup抓取时,页面元素与浏览器Inspect显示不一致的问题
问题分析与解决方案
出现这个问题的核心原因是:Zillow的抵押贷款利率表格是通过JavaScript动态渲染生成的,你用requests.get()获取的是服务器返回的静态HTML源码,这部分源码里并没有浏览器开发者工具中看到的<tr>元素,自然无法通过BeautifulSoup抓取到。
下面提供两种可行的解决方法:
方法一:使用Selenium模拟浏览器渲染页面
Selenium可以模拟真实浏览器加载页面,等待JavaScript完成渲染后再获取完整的页面内容,步骤如下:
- 先安装Selenium和对应浏览器的驱动(比如ChromeDriver)
- 编写代码模拟浏览器访问并抓取数据:
from bs4 import BeautifulSoup 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 import pandas as pd url = 'https://www.zillow.com/mortgage-rates/' # 初始化Chrome浏览器(需确保ChromeDriver已配置到环境变量) driver = webdriver.Chrome() driver.get(url) # 等待表格tbody加载完成,最长等待10秒 wait = WebDriverWait(driver, 10) tbody = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'hLYlju'))) # 获取渲染后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'html.parser') # 抓取表格行 table = soup.find('tbody', class_='StyledTableBody-c11n-8-64-1__sc-8i1s74-0 hLYlju') rows = table.find_all('tr') # 处理数据(示例:打印每行内容) for row in rows: print([cell.get_text(strip=True) for cell in row.find_all('td')]) # 关闭浏览器 driver.quit()
方法二:直接调用数据API(更高效)
通过浏览器开发者工具分析页面的网络请求,可以找到Zillow获取表格数据的API接口,直接请求该接口获取JSON格式的数据,无需处理页面渲染:
- 打开浏览器开发者工具(F12)→ 切换到Network标签 → 刷新页面
- 筛选XHR请求,找到返回利率数据的接口(具体接口可能会随网站更新变化)
- 直接请求该接口获取数据:
import requests import pandas as pd # 实际接口地址需根据当前页面的网络请求确认 api_url = 'https://www.zillow.com/mortgage/api/rates' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } response = requests.get(api_url, headers=headers) data = response.json() # 解析JSON数据生成DataFrame(示例,需根据实际返回结构调整) rates_data = data['data']['rates'] df = pd.DataFrame(rates_data) print(df.head())
注意:API接口可能会随着Zillow网站更新而变化,需要定期检查接口地址和参数;同时请求时要带上合理的User-Agent,避免被反爬拦截。
内容的提问来源于stack exchange,提问作者Quite Orange
相关产品推荐
相关产品推荐

