Flutter网页爬取时如何移除href属性值开头的前置点号
解决方案
你当前硬拼接根域名和href属性值的写法,无法处理相对路径前缀,有两种可落地的实现方式:
方案1:针对性移除前置./(适配当前固定场景)
提取href值后判断前缀,裁掉开头的./字符即可,修改url生成逻辑如下:
final urls = document .querySelectorAll("dl > dd > a") .map((element) { final rawHref = element.attributes['href'] ?? ''; final processedHref = rawHref.startsWith('./') ? rawHref.substring(2) : rawHref; return 'https://www.ous.ac.jp$processedHref'; }) .toList();
*该方案仅能处理./开头的相对路径,若页面存在../(上级目录跳转)类的路径会拼接错误,仅适合当前站点路径规则完全固定的场景。
方案2:用内置Uri工具自动解析路径(推荐,兼容性更强)
Dart自带的Uri类提供了相对路径解析能力,不需要手动写字符串替换规则,可自动适配./、../、无前置点号的相对路径等所有标准相对路径格式,不会出现拼接错误,实现代码如下:
// 预先定义爬取页面的基地址 final baseUri = Uri.parse('https://www.ous.ac.jp/topics/'); final urls = document .querySelectorAll("dl > dd > a") .map((element) { final rawHref = element.attributes['href'] ?? ''; // 自动完成相对路径到完整URL的转换 return baseUri.resolve(rawHref).toString(); }) .toList();
该方案鲁棒性更强,后续爬取其他站点也可以直接复用逻辑,不需要针对每个站点单独写路径处理规则。
内容的提问来源于stack exchange,提问作者gadgelogger
相关产品推荐
相关产品推荐

