爬取Nature网站提取作者名遇AttributeError及ValueError问题求助
解决Nature网站爬取时作者提取失败及数组长度不一致问题
我来帮你拆解下遇到的两个问题,然后一步步解决:
问题原因分析
AttributeError报错:
这是因为部分文章(比如新闻稿、编辑专栏这类内容)的HTML结构里没有带itemprop="name"属性的<span>标签,调用links.find('span', {"itemprop": "name"})会返回None,再对None调用.get_text()自然就会报错。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
相关产品推荐
相关产品推荐

