You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:53:30