C#结合HTML Agility Pack做网页抓取时如何不使用try-catch处理UriFormatException
C#配合HTML Agility Pack的用户输入URL合法性校验方案
以下方案完全兼容HTML Agility Pack依赖,无需修改原有抓取逻辑,仅需在调用Load方法前插入前置校验步骤即可实现提前拦截非法URL的需求:
- 核心校验逻辑使用.NET内置的
Uri.TryCreate方法实现,无需额外引入依赖,性能优于异常捕获机制:
string userInputUrl = 用户输入的原始内容; Uri validUri = null; // 仅接受http/https协议的绝对URI,符合网页抓取的业务场景 if (!Uri.TryCreate(userInputUrl, UriKind.Absolute, out validUri) || (validUri.Scheme != Uri.UriSchemeHttp && validUri.Scheme != Uri.UriSchemeHttps)) { // 此处执行你的兜底逻辑,比如弹出格式错误提示 Console.WriteLine("请输入正确的以http/https开头的站点地址"); return; } // 校验通过后再调用HTML Agility Pack的加载方法,不会触发UriFormatException异常 var document = mywebsite.Load(validUri.AbsoluteUri);
- 可选体验优化:如果需要兼容用户漏写http前缀的场景,可以增加自动补全后的二次校验逻辑:
string userInputUrl = 用户输入的原始内容.Trim(); Uri validUri = null; // 先校验原始输入 if (!Uri.TryCreate(userInputUrl, UriKind.Absolute, out validUri) || (validUri.Scheme != Uri.UriSchemeHttp && validUri.Scheme != Uri.UriSchemeHttps)) { // 补全https前缀后二次校验 if (!Uri.TryCreate($"https://{userInputUrl}", UriKind.Absolute, out validUri) || (validUri.Scheme != Uri.UriSchemeHttp && validUri.Scheme != Uri.UriSchemeHttps)) { Console.WriteLine("请输入正确的站点地址"); return; } } var document = mywebsite.Load(validUri.AbsoluteUri);
- 可扩展的业务校验方向:如果有特殊业务需求,可在校验流程中额外增加域名规则校验、禁止内网/本地回环地址校验、高危站点黑名单校验等逻辑,进一步提升输入合法性。
内容的提问来源于stack exchange,提问作者Virophage
相关产品推荐
相关产品推荐

