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

BeautifulSoup返回HTML与开发者工具不符,无法爬取目标<a>元素

问题根源

你遇到的情况是因为目标页面的联系人链接是JavaScript动态渲染出来的——用urlopen直接请求只能拿到页面的初始静态HTML,那些需要JS加载的动态元素并不会包含在返回内容里,所以BeautifulSoup自然找不到目标元素。

两种解决办法

方法一:用Selenium模拟浏览器加载页面

Selenium会启动真实浏览器(可配置无头模式),自动执行页面JS渲染出完整内容,再获取源码解析,完美适配动态页面。

代码示例

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

def get_soup_with_selenium(url):
    # 配置Chrome无头模式(可选,不弹出浏览器窗口)
    chrome_options = Options()
    chrome_options.add_argument('--headless=new')
    chrome_options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36')
    
    driver = webdriver.Chrome(options=chrome_options)
    driver.get(url)
    # 等待页面加载完成,可根据实际情况调整等待时间
    time.sleep(3)
    # 获取渲染后的完整页面源码
    html_page = driver.page_source
    driver.quit()
    
    soup = BeautifulSoup(html_page, 'html.parser')
    return soup

url = "https://findamortgagebroker.com/?search=San%20Diego&page=2"
soup = get_soup_with_selenium(url)
links = soup.find_all('a', attrs={'class':'clickable-tile-contact'})
print(len(links))  # 现在应该能正常获取到目标链接

注意事项

  • 需要先安装Selenium:pip install selenium
  • 下载对应浏览器的驱动(比如ChromeDriver),确保驱动版本和浏览器版本匹配

方法二:直接抓取页面的API接口

动态页面的数据通常是通过AJAX请求从后端API获取的,直接请求API拿JSON数据比解析HTML更高效。

操作步骤

  1. 打开浏览器开发者工具(F12),切换到「Network」标签,刷新页面
  2. 筛选「XHR/Fetch」类型的请求,找到包含联系人数据的接口(比如类似/api/search的请求)
  3. 复制该请求的URL、请求参数和Headers,用requests直接请求

代码示例(假设找到的API接口如下)

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Accept': 'application/json',
    # 可从开发者工具复制其他必要Headers,比如Referer、X-Requested-With等
}

params = {
    'search': 'San Diego',
    'page': 2
}

response = requests.get('https://findamortgagebroker.com/api/search', headers=headers, params=params)
data = response.json()
# 从返回的JSON数据中提取联系人链接,具体结构需根据实际返回内容调整
for item in data.get('results', []):
    contact_link = item.get('contact_url')
    print(contact_link)

注意事项

  • 请求API时不要过于频繁,避免被目标网站封禁IP
  • 若API需要验证(比如Cookie、Token),需从开发者工具中复制对应参数

内容的提问来源于stack exchange,提问作者Mohamed Hedeya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:31:16