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

爬取Nature网站提取作者名遇AttributeError及ValueError问题求助

解决Nature网站爬取时作者提取失败及数组长度不一致问题

我来帮你拆解下遇到的两个问题,然后一步步解决:

问题原因分析

  1. AttributeError 报错:
    这是因为部分文章(比如新闻稿、编辑专栏这类内容)的HTML结构里没有带itemprop="name"属性的<span>标签,调用links.find('span', {"itemprop": "name"})会返回None,再对None调用.get_text()自然就会报错。

  2. ValueError: arrays must all be same length:
    你把整个for循环都包在了try-except里,一旦某篇文章处理出错,整个循环就会中断,导致当前页面后续的文章数据没有被添加到data2的数组中,最终各个数组的长度不一致,无法生成DataFrame。

改进后的代码

import requests
from bs4 import BeautifulSoup
import time
import pandas as pd

data2 = { 'url' : [], 'title' : [], 'category': [], 'author': [], }
url_pattern = "https://www.nature.com/nature/articles?searchType=journalSearch&sort=PubDate&year=2018&page={}"
count_min = 1
count_max = 3

while count_min <= count_max:
    print(count_min)
    url = url_pattern.format(count_min)
    r = requests.get(url)
    
    try:
        soup = BeautifulSoup(r.content, 'lxml')
        for links in soup.find_all('article'):
            try:
                # 提取URL、标题、分类
                data2['url'].append(links.a.attrs['href'])
                data2['title'].append(links.h3.get_text().strip())
                data2["category"].append(links.span.get_text().strip())
                
                # 安全提取作者:先判断元素是否存在
                author_elem = links.find('span', {"itemprop": "name"})
                if author_elem:
                    data2["author"].append(author_elem.get_text().strip())
                else:
                    # 没有找到作者时用默认值填充
                    data2["author"].append("Unknown Author")
            except Exception as exc:
                # 单篇文章出错时,记录错误并补全空值保证数组长度一致
                print(f"处理文章时出错: {exc.__class__.__name__}, {exc}")
                data2['url'].append(None)
                data2['title'].append(None)
                data2["category"].append(None)
                data2["author"].append(None)
    except Exception as exc:
        print(f"处理页面{count_min}时出错: {exc.__class__.__name__}, {exc}")
    
    time.sleep(0.1)
    count_min += 1

print("Fertig.")
df = pd.DataFrame(data2)
print(df)

关键改进点

  • 安全提取作者:先通过author_elem = links.find(...)获取元素,再判断是否存在,存在则提取文本,不存在则用Unknown Author(或空字符串)填充,避免None调用方法的错误。
  • 缩小异常捕获范围:把try-except放到for循环内部,针对单篇文章的处理。这样即使某篇文章出错,也只会跳过这一篇,不会影响整个页面的其他文章,同时出错时补全四个字段的空值,保证所有数组长度一致。
  • 页面级异常捕获:保留外层的try-except处理整个页面的加载/解析错误,避免某一页出错导致整个爬取中断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:34:11