如何用BeautifulSoup4匹配对应BEANS与SAUSAGES标签提取信息?
解决方案
直接利用BeautifulSoup的兄弟节点查找方法就能精准关联每个BEANS和紧随其后的SAUSAGES标签,核心思路是遍历所有BEANS标签,对每个标签直接定位它的下一个SAUSAGES兄弟节点,完全适配交替结构的场景。
完整实现代码
import os import requests from bs4 import BeautifulSoup # 配置目标URL与根目录 TARGET_URL = "https://url.com" ROOT_DIR = "C:/Root Dir Name" # 获取并解析HTML内容 response = requests.get(TARGET_URL) soup = BeautifulSoup(response.content, "html.parser") # 定位外层无类名div(若页面有多个同类外层div,需补充更精准的选择器) outer_div = soup.find("div", class_=None) # 遍历所有BEANS标签 for beans_div in outer_div.find_all("div", class_="BEANS"): # 提取子目录名(自动去除首尾空白字符) subdir_name = beans_div.get_text(strip=True) # 找到当前BEANS紧随的SAUSAGES标签 sausages_div = beans_div.find_next_sibling("div", class_="SAUSAGES") if not sausages_div: continue # 若没有对应SAUSAGES标签则跳过 # 遍历SAUSAGES内的所有下载链接 for link in sausages_div.find_all("a", href=True): file_url = link["href"] # 从链接中提取文件名 file_name = os.path.basename(file_url) # 拼接完整保存路径 save_path = os.path.join(ROOT_DIR, subdir_name, file_name) # 自动创建子目录(不存在则生成) os.makedirs(os.path.dirname(save_path), exist_ok=True) # 下载并保存文件 file_response = requests.get(file_url) with open(save_path, "wb") as f: f.write(file_response.content)
关键逻辑说明
- 标签关联:
beans_div.find_next_sibling("div", class_="SAUSAGES")会自动跳过中间的空白文本节点或无关元素,直接定位当前BEANS之后的第一个SAUSAGES标签,比手动遍历所有子元素更简洁可靠。 - 路径处理:用
os.path.join()拼接路径,避免手动写字符串出现的斜杠兼容问题;os.makedirs(..., exist_ok=True)确保子目录不存在时自动创建,无需额外判断。 - 容错处理:增加
if not sausages_div的判断,避免因HTML结构异常(比如末尾只有BEANS无SAUSAGES)导致的代码报错。
内容的提问来源于stack exchange,提问作者TiffanyTFP
相关产品推荐
相关产品推荐

