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

如何用Python解析HTML链接?requests+bs4遇空ul问题求解

解决动态加载内容的链接抓取问题

你遇到的问题很典型——这个网站的链接列表是JavaScript动态渲染的,requests库只能获取服务器返回的初始HTML,此时页面里的<ul class="ais-Hits-list">还没被JS填充内容,所以你拿到的是空列表。下面给你两种可行的解决方案:

方案一:使用Selenium模拟浏览器加载(简单直观)

Selenium会模拟真实浏览器打开页面,等待JavaScript执行完成后再获取渲染后的HTML,这样就能拿到完整的链接列表了。

步骤:

  1. 安装依赖和浏览器驱动:

    pip install selenium
    

    同时下载对应浏览器的驱动(比如Chrome的ChromeDriver),确保驱动版本和浏览器版本匹配,把驱动放到系统PATH里或者代码中指定路径。

  2. 示例代码:

    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
    from bs4 import BeautifulSoup
    
    link = "https://www.over-view.com/digital-index/"
    # 初始化Chrome浏览器(也可替换为Firefox等)
    driver = webdriver.Chrome()
    driver.get(link)
    
    try:
        # 等待列表元素加载完成,最多等待10秒
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "ais-Hits-list"))
        )
        # 获取渲染后的完整页面源码
        page_source = driver.page_source
        soup = BeautifulSoup(page_source, 'lxml')
        # 提取所有链接
        links = soup.select("ul.ais-Hits-list a")
        for a_tag in links:
            print(a_tag.get("href"))
    finally:
        # 用完记得关闭浏览器
        driver.quit()
    

方案二:直接请求后端API(更高效)

动态加载的内容通常来自后端的API接口,你可以通过浏览器开发者工具找到这个接口,直接用requests请求它,无需模拟浏览器,速度更快。

步骤:

  1. 打开浏览器开发者工具(F12),切换到「Network」标签,刷新页面后筛选「XHR」类型的请求,找到返回列表数据的接口(比如类似/api/digital-index的请求)。
  2. 复制该接口的URL、请求头和参数,用requests直接请求:

示例代码(需替换为你实际找到的API接口):

import requests

api_url = "https://www.over-view.com/api/your-found-api-endpoint"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    # 从开发者工具中复制其他必要请求头,比如Referer、Cookie等
}

response = requests.get(api_url, headers=headers)
data = response.json()
# 根据API返回的JSON结构提取链接,示例如下:
for item in data["hits"]:
    print(item["url"])  # 具体字段名需参考实际返回的JSON结构

注意事项:

  • 部分API接口需要携带特定请求头或参数才能正常返回数据,一定要从浏览器的请求中完整复制。
  • 如果API有反爬机制,比如校验Cookie或验证码,Selenium方案会更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:42:56