求助:Python提取纽约时报文章作者姓名程序故障排查
问题排查:纽约时报文章作者提取失败的原因及修复方案
问题背景
你编写的Python程序需读取存储纽约时报文章链接的CSV文件,提取对应作者姓名后输出新CSV。使用bs4库开发,已确认作者姓名包含在css-1baulvz last-byline类的标签中,但运行后仅约3%的文章能成功提取作者,其余均返回Author not found。
问题根源分析
你的extract_author函数存在以下关键问题:
无请求头触发反爬机制
纽约时报服务器会检测请求来源,直接用requests.get(url)发送的请求没有浏览器标识,会被判定为非合法请求,返回的页面可能是反爬页面、付费墙占位页,而非真实文章内容,自然找不到作者标签。多类名匹配方式错误
原代码中{'class': 'css-1baulvz last-byline'}是将两个类名作为完整字符串匹配,但HTML中标签的class属性是多个独立类,空格仅作分隔符。这种写法只有当class属性值完全等于该字符串时才会匹配成功,而实际页面中标签的class顺序或空格数量可能有差异,导致匹配失败。缺乏异常处理
请求过程中可能出现超时、连接错误等问题,直接返回Author not found会掩盖真实错误,也可能导致程序中途崩溃。
修复后的代码
import requests from bs4 import BeautifulSoup def extract_author(url): # 模拟浏览器请求头,避免反爬 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } try: response = requests.get(url, headers=headers, timeout=10) # 确保请求成功 response.raise_for_status() soup = BeautifulSoup(response.text, 'html.parser') # 用CSS选择器匹配多类名标签,更可靠 author = soup.select_one('span.css-1baulvz.last-byline') if author: return author.text.strip() # 备选:匹配可能的其他作者标签 author = soup.select_one('a.css-n8ff4n.e1jsehar0') if author: return author.text.strip() # 兜底:从meta标签提取作者(部分文章可能在meta中) meta_author = soup.find('meta', attrs={'name': 'author'}) if meta_author: return meta_author.get('content', '').strip() except Exception as e: print(f"处理URL {url} 时出错: {str(e)}") return 'Author not found'
关键修改说明
- 添加请求头:通过
User-Agent模拟浏览器请求,降低被反爬拦截的概率,确保获取真实的文章页面。 - 改用CSS选择器:
select_one('span.css-1baulvz.last-byline')可准确匹配同时包含这两个类的span标签,不受类名顺序和空格的影响。 - 异常处理:捕获请求过程中的异常,打印错误信息便于排查,同时避免程序因单个链接问题中断。
- 增加兜底提取方式:补充从meta标签提取作者的逻辑,覆盖更多页面结构的情况。
内容的提问来源于stack exchange,提问作者codingquestions1239
相关产品推荐
相关产品推荐

