Selenium+BeautifulSoup爬取问题:Query行提取与文件命名关联
解决IS Finder BLAST自动化脚本的Query提取与下载关联问题
问题1:正确提取并存储HTML中的"Query"行
先通过浏览器开发者工具定位结果页面中"Query"行的HTML结构(标签类型、class、文本特征等),再结合Selenium等待与BeautifulSoup提取:
from bs4 import BeautifulSoup from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待动态加载的Query元素出现 WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.XPATH, "//*[contains(text(), 'Query:')]")) ) # 解析页面HTML soup = BeautifulSoup(driver.page_source, 'html.parser') # 提取所有Query行,根据实际页面结构调整选择器 query_rows = soup.find_all(lambda tag: tag.name in ['tr', 'div'] and 'Query:' in tag.get_text(strip=True)) # 存储Query名称到列表 query_names = [] for row in query_rows: raw_text = row.get_text(strip=True) # 按"Query: 序列名称"格式分割提取名称 query_name = raw_text.split('Query:')[1].strip() query_names.append(query_name)
优化提示:如果Query行有专属class(比如query-header),直接用soup.find_all('div', class_='query-header')会更精准高效。
问题2:关联下载链接与对应的Query行
核心是找到Query与下载链接的共同父容器,确保一对一匹配,避免错位:
# 假设每个结果项包裹在class为"result-item"的独立容器中 result_containers = soup.find_all('div', class_='result-item') # 构建Query与下载链接的映射字典 query_link_mapping = {} for container in result_containers: # 从当前容器提取Query名称 query_elem = container.find(lambda tag: 'Query:' in tag.get_text(strip=True)) if not query_elem: continue query_name = query_elem.get_text(strip=True).split('Query:')[1].strip() # 从当前容器提取下载链接(替换为实际链接的文本/属性) download_elem = container.find('a', string='Download') if download_elem and 'href' in download_elem.attrs: download_url = download_elem['href'] # 处理相对链接 if not download_url.startswith('http'): download_url = f"https://isfinder.biotoul.fr{download_url}" query_link_mapping[query_name] = download_url # 遍历映射字典下载文件,用Query名称命名 import requests for query_name, url in query_link_mapping.items(): try: response = requests.get(url, timeout=30) response.raise_for_status() with open(f"{query_name}_blast_result.txt", 'wb') as f: f.write(response.content) except Exception as e: print(f"下载{query_name}失败: {str(e)}")
特殊场景处理:如果页面无统一结果容器,可通过Query元素的find_next_sibling()方法定位其后续的下载链接元素;若下载链接需点击才生成,用Selenium模拟点击后再提取链接。
内容的提问来源于stack exchange,提问作者somilsharma
相关产品推荐
相关产品推荐

