Python使用BeautifulSoup爬取ul下li仅返回第一条数据的问题求解
问题原因
- 反爬机制限制:目标网站对未携带User-Agent标识的请求会返回不完整的页面内容,多数情况下你拿到的HTML中
sub-terms类的ul下只有1个li节点,因此循环仅执行一次就结束,你贴出的3条输出属于偶然请求到完整页面的不稳定结果。 - 代码容错性不足:如果单个
single-sub-term类li节点下不存在你查找的<h3>标签或first-line类的span标签,find()方法会返回None,调用.text属性会直接抛出AttributeError导致程序中断,无法遍历后续节点。 - 变量命名不规范:你使用了Python内置关键字
list作为循环变量名,会覆盖内置的列表类定义,存在潜在逻辑风险。
修复方案
调整代码逻辑,增加请求头伪装,添加元素存在性判断,修改不规范变量名即可稳定获取全部3条数据,参考代码如下:
from bs4 import BeautifulSoup import requests # 添加请求头伪装成浏览器请求 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" } html_text = requests.get('https://www.geva.co.il/solution_term/english_2021_summer/', headers=headers).text soup = BeautifulSoup(html_text, 'lxml') entire_page = soup.find('ul', class_ = 'sub-terms') term_lists = entire_page.find_all('li', class_ ='single-sub-term') for term_item in term_lists: # 增加元素存在性判断,避免报错中断 date_tag = term_item.find('h3') pdf_tag = term_item.find('span', class_='first-line') date = date_tag.text.strip() if date_tag else "无日期信息" pdf_info = pdf_tag.text.strip() if pdf_tag else "无编号信息" print(f'''Welcome! Current date - {date} Term Number : {pdf_info} ''') print('')
调整后可以稳定输出全部3条考试信息,不会出现中途中断或者数据缺失的问题。
内容的提问来源于stack exchange,提问作者ThomasReiner
相关产品推荐
相关产品推荐

