如何通过类名定位<ul>并提取其<li>内链接?(代码返回空列表)
解决无法定位目标
- 标签及提取链接的方案
可能的原因及对应解决方法
1. 类名选择器使用错误
BeautifulSoup处理多类名的<ul>标签时,不能直接将所有类名拼接成一个字符串传入find_all,因为HTML的class属性是空格分隔的多类集合,需要精准匹配。推荐两种正确写法:
from bs4 import BeautifulSoup import requests url = "你的目标网页URL" # 务必添加User-Agent,避免被网站拦截 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"} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 方法1:通过class_参数传入类名列表 target_ul = soup.find_all("ul", class_=["hover", "p-0", "job-search-key-kgm6qi", "exy0tjh1"]) # 方法2:使用CSS选择器(更简洁直观) target_ul = soup.select("ul.hover.p-0.job-search-key-kgm6qi.exy0tjh1")
2. 页面内容动态加载
如果目标<ul>是通过JavaScript动态渲染生成的,requests只能获取到初始静态HTML,无法拿到动态加载的内容。这时需要用浏览器自动化工具模拟页面加载:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By url = "你的目标网页URL" # 初始化Chrome浏览器(需提前安装ChromeDriver并配置环境变量) driver = webdriver.Chrome() driver.get(url) # 等待目标元素加载完成,超时时间10秒 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "ul.hover.p-0.job-search-key-kgm6qi.exy0tjh1")) ) finally: page_source = driver.page_source driver.quit() soup = BeautifulSoup(page_source, "html.parser") target_ul = soup.select("ul.hover.p-0.job-search-key-kgm6qi.exy0tjh1")
3. 请求头缺失触发反爬
部分网站会校验请求头中的User-Agent、Referer等字段,缺失时会返回不完整页面或空内容。确保请求头包含必要字段,示例见第一个代码块。
提取目标链接
定位到目标<ul>后,遍历其子<li>标签提取链接:
if target_ul: # 取第一个匹配的<ul>(如有多个可根据需求调整索引) target_list = target_ul[0] links = [] for li in target_list.find_all("li"): a_tag = li.find("a") if a_tag and a_tag.get("href"): # 将相对链接转为绝对链接 full_link = requests.compat.urljoin(url, a_tag.get("href")) links.append(full_link) print("提取到的链接:", links) else: print("未找到目标<ul>标签")
内容的提问来源于stack exchange,提问作者octaviodiego78
相关产品推荐
相关产品推荐

