如何抓取网站导航栏并保留内容层级结构
抓取带层级的导航栏并转为字典(基于BeautifulSoup)
针对你遇到的导航栏层级丢失问题,直接提取文本会抹平主菜单和下拉菜单的关联,需要根据页面DOM结构遍历主菜单项及其对应的子菜单,构建目标字典。
实现步骤
- 定位导航栏中的主菜单项:找到导航栏下包含下拉菜单的顶级列表项
- 遍历每个主菜单项,提取主标题文本
- 定位当前主菜单项下的下拉子菜单,提取所有子项文本
- 将主标题作为键、子项列表作为值,存入字典
完整代码
from bs4 import BeautifulSoup as bs import requests url = 'https://www.tyremarket.com/Car-Tyres' html_text = requests.get(url).text soup = bs(html_text, 'html.parser') # 初始化存储导航层级的字典 nav_dict = {} # 定位所有主菜单项(目标网站中主菜单项是.navbar-nav下的顶级li) main_menu_items = soup.select('nav .navbar-nav > li') for item in main_menu_items: # 提取主菜单标题 main_title = item.get_text(strip=True) # 定位当前主菜单项下的下拉子菜单 sub_menu = item.select_one('ul.dropdown-menu') if sub_menu: # 提取所有子项的文本 sub_items = [a.get_text(strip=True) for a in sub_menu.select('li a')] nav_dict[main_title] = sub_items else: # 没有下拉菜单的主项,值设为空列表 nav_dict[main_title] = [] # 打印结果 for key, value in nav_dict.items(): print(f"'{key}': {value}")
代码说明
- 使用
select方法精准定位DOM元素:nav .navbar-nav > li确保只取导航栏的顶级主菜单项,避免嵌套层级干扰 - 对每个主菜单项,通过
select_one('ul.dropdown-menu')检查是否存在下拉菜单 - 子项文本通过遍历下拉菜单内的
a标签提取,确保只获取有效链接文本 - 无下拉菜单的主项会被赋值为空列表,保证字典结构统一
示例输出
{'Tyre Mantra': ['Advisory', 'Featured', 'News', 'Videos'], 'Car Tyres': ['By Vehicle Brand', 'By Tyre Brand', 'By Size'], 'SUV Tyres': ['By Vehicle Brand', 'By Tyre Brand', 'By Size'], ...}
内容的提问来源于stack exchange,提问作者Rovsh
相关产品推荐
相关产品推荐

