爬取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




