如何用Python解析HTML链接?requests+bs4遇空ul问题求解
解决动态加载内容的链接抓取问题
你遇到的问题很典型——这个网站的链接列表是JavaScript动态渲染的,requests库只能获取服务器返回的初始HTML,此时页面里的<ul class="ais-Hits-list">还没被JS填充内容,所以你拿到的是空列表。下面给你两种可行的解决方案:
方案一:使用Selenium模拟浏览器加载(简单直观)
Selenium会模拟真实浏览器打开页面,等待JavaScript执行完成后再获取渲染后的HTML,这样就能拿到完整的链接列表了。
步骤:
安装依赖和浏览器驱动:
pip install selenium同时下载对应浏览器的驱动(比如Chrome的ChromeDriver),确保驱动版本和浏览器版本匹配,把驱动放到系统PATH里或者代码中指定路径。
示例代码:
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请求它,无需模拟浏览器,速度更快。
步骤:
- 打开浏览器开发者工具(F12),切换到「Network」标签,刷新页面后筛选「XHR」类型的请求,找到返回列表数据的接口(比如类似
/api/digital-index的请求)。 - 复制该接口的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
相关产品推荐
相关产品推荐

