You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

爬取PubMed摘要导出Excel仅获第一条结果的问题及代码修正

解决PubMed摘要爬取后Pandas仅导出单条数据的问题

嘿,我来帮你搞定这个问题!你遇到的情况是因为代码里的核心逻辑有个小问题:每次循环都会创建新的DataFrame并直接覆盖Excel文件,而不是把所有爬取到的数据先攒起来再一次性导出。

你看,原来的代码里,每遍历一个URL就生成只包含当前条目的DataFrame,然后立刻写入Excel——这会把之前写入的内容完全覆盖掉。哪怕你爬了三个URL,最终文件里只会保留最后一次循环的结果(你说只看到第一条,大概率是后续请求出了小差错,但核心逻辑问题是一致的)。

修正方案

我们需要先把所有爬取到的数据累积到一个列表里,等全部爬完后再统一生成DataFrame并导出:

from bs4 import BeautifulSoup
from urllib.request import urlopen
import requests
import pandas as pd

abstracturllist = ['https://www.ncbi.nlm.nih.gov/pubmed/31098966', 
                   'https://www.ncbi.nlm.nih.gov/pubmed/31067303', 
                   'https://www.ncbi.nlm.nih.gov/pubmed/31045693']

# 初始化空列表用来存储所有爬取到的数据
data_list = []

for th in abstracturllist:
    response = requests.get(th)
    soup = BeautifulSoup(response.content, 'html.parser')
    
    # 加个异常处理,避免某个页面解析失败导致整个程序挂掉
    try:
        # 获取摘要内容
        abstract_content = soup.select('div.abstr')[0].prettify()
        # 将当前URL和摘要以字典形式加入列表
        data_list.append({'URL': th, 'abstract': abstract_content})
    except IndexError:
        print(f"⚠️ 警告:无法获取URL {th} 的摘要内容,可能页面结构有变化")

# 用整个数据列表创建DataFrame
df = pd.DataFrame(data_list)
# 导出到Excel,index=False去掉默认的索引列,让表格更干净
df.to_excel('URLsandAbstracts.xlsx', index=False)

额外优化说明

  • 加入了try-except块:如果某个PubMed页面的结构变了,或者请求失败,程序不会直接崩溃,还会提示你哪个URL出了问题。
  • 使用index=False:导出的Excel不会包含Pandas自动生成的索引列,表格更符合日常使用习惯。
  • 核心逻辑调整:先把所有数据收集到列表,再一次性生成DataFrame和导出,彻底避免了文件被覆盖的问题。

内容的提问来源于stack exchange,提问作者tenebris silentio

火山引擎 最新活动