AngleSharp从v0.9.9.0升级到v0.9.9.2后出现DateTime格式识别异常
解决AngleSharp v0.9.9.2升级后的DateTime解析异常问题
你遇到的问题核心是AngleSharp在v0.9.9.2版本中对Cookie日期的解析逻辑变得更严格了——目标网站返回的Cookie包含不符合标准格式的日期字符串,触发了String was not recognized as a valid DateTime异常,最终被包装成AggregateException抛出。
问题根源
v0.9.9.0版本的AngleSharp对Cookie日期解析的容错性较高,即便日期格式不标准也能兼容处理;但v0.9.9.2修复了相关解析逻辑,开始严格遵循RFC规范解析Cookie日期,当目标网站返回的Set-Cookie头里的日期格式不符合规范时,就会触发解析失败。
解决方案
你可以通过自定义Cookie管理器来处理无效的日期解析,或者直接跳过有问题的Cookie。下面是两种可行的实现方式:
方案1:自定义Cookie管理器(推荐)
通过自定义ICookieManager实现,捕获日期解析异常并跳过无效Cookie,既保留Cookie功能,又避免异常:
var siteUrl = "https://richmond.csod.com/ats/careersite/search.aspx?site=1&c=richmond"; // 使用自定义Cookie管理器 var customCookieManager = new TolerantCookieManager(); var configuration = Configuration.Default .WithDefaultLoader() .WithCookieManager(customCookieManager); var currentContext = BrowsingContext.New(configuration); var originalDoc = currentContext.OpenAsync(siteUrl).Result; Console.WriteLine(originalDoc.DocumentElement.OuterHtml); // 自定义容错Cookie管理器 public class TolerantCookieManager : ICookieManager { private readonly List<Cookie> _cookies = new(); public void SetCookie(Url url, Cookie cookie) { try { // 尝试解析日期,失败则忽略过期时间设置 if (!string.IsNullOrWhiteSpace(cookie.Expires)) { if (DateTime.TryParse(cookie.Expires, out var validExpires)) { cookie.Expires = validExpires.ToString("R"); } else { // 如果解析失败,清空过期时间,让Cookie成为会话Cookie cookie.Expires = string.Empty; } } _cookies.Add(cookie); } catch (FormatException ex) { Console.WriteLine($"忽略格式无效的Cookie [{cookie.Name}]: {ex.Message}"); } } public IEnumerable<Cookie> GetCookies(Url url) { return _cookies.Where(c => c.Matches(url)); } public void DeleteCookie(Cookie cookie) => _cookies.Remove(cookie); public void DeleteCookies(Url url) => _cookies.RemoveAll(c => c.Matches(url)); }
方案2:禁用Cookie支持(简化版)
如果你的场景不需要依赖Cookie,可以直接去掉Cookie支持,绕过日期解析问题:
var siteUrl = "https://richmond.csod.com/ats/careersite/search.aspx?site=1&c=richmond"; // 移除.WithCookies(),禁用Cookie处理 var configuration = Configuration.Default.WithDefaultLoader(); var currentContext = BrowsingContext.New(configuration); var originalDoc = currentContext.OpenAsync(siteUrl).Result; Console.WriteLine(originalDoc.DocumentElement.OuterHtml);
注意:这种方法可能影响网站的正常访问(比如需要Cookie维持会话的场景),仅适合无Cookie依赖的爬取需求。
内容的提问来源于stack exchange,提问作者Matt Burland
相关产品推荐
相关产品推荐

