使用Python BS4提取网页各列顶级li的href遇到问题
解决网页抓取问题
问题分析
你要抓取的是每个col-sm-6列下的顶级分类(如Shoulders、Neck)的链接,但原代码会抓取到所有ul里的链接(包括子项),核心问题是没有限制查找范围到直接子元素,还存在变量名冲突。
修正后的代码
cut_url = "https://exrx.net/Lists/" exrx = [] for div in soup.find_all('div', class_='col-sm-6'): # 只找当前div下的直接子ul,不递归查找嵌套的ul main_ul = div.find('ul', recursive=False) if main_ul: # 只找当前ul下的直接子li(顶级分类项),排除子ul里的li for li in main_ul.find_all('li', recursive=False): a_tag = li.find('a') # 确保a标签存在且包含href属性 if a_tag and 'href' in a_tag.attrs: url = cut_url + a_tag['href'] exrx.append(url)
关键修改点
- 用
recursive=False限制查找范围:先获取div的直接子ul,再获取该ul的直接子li,彻底排除嵌套的子项; - 重命名循环变量为
div,避免覆盖外层的a标签变量; - 增加对a标签和href属性的存在性检查,防止运行时报错。
内容的提问来源于stack exchange,提问作者LaddieMawery
相关产品推荐
相关产品推荐

