使用Dart获取HTML中small标签文本遇空列表问题求助
解决Dart HTML解析中small标签文本提取失败的问题
嘿,我看你在提取small标签文本的时候踩了个语法小坑,导致返回空列表啦!咱们一步步来解决:
问题根源
你写的这段代码有语法错误:
List perfumeBrand = perfumes.map((element) => element.getElementsByTagName(('small')[0])).toList();
这里的('small')[0]会被解析成取字符串'small'的第一个字符s,相当于你在找标签名为s的元素,自然找不到任何内容,所以返回空列表。
修正代码
正确的做法是给getElementsByTagName传入完整的标签名'small',然后获取第一个匹配元素的文本内容,同时为了避免找不到元素时报错,建议用firstOrNull做安全处理:
// 修正后的perfumeBrand提取逻辑 List<String> perfumeBrand = perfumes.map((element) { final smallElement = element.getElementsByTagName('small').firstOrNull; return smallElement?.text ?? ''; // 如果没有small标签就返回空字符串 }).toList();
整合为JSON对象
接下来把所有提取到的字段(名称、品牌、图片链接、页面链接)整合成JSON对象,记得先导入dart:convert库:
import 'dart:convert'; import 'package:html/parser.dart' show parse; import 'package:html/dom.dart'; // 假设你已经获取到了document对象 void main() { List<Element> perfumes = document.getElementsByClassName('cell card fr-news-box'); // 提取各字段(添加了空安全处理) List<String> perfumeImg = perfumes.map((element) => element.getElementsByTagName('img')[0].attributes['src'] ?? '').toList(); List<String> perfumeLink = perfumes.map((element) => element.getElementsByTagName('a')[0].attributes['href'] ?? '').toList(); List<String> perfumeName = perfumes.map((element) => element.getElementsByTagName('a')[0].text).toList(); List<String> perfumeBrand = perfumes.map((element) { final smallElement = element.getElementsByTagName('small').firstOrNull; return smallElement?.text ?? ''; }).toList(); // 整合成JSON数组 List<Map<String, dynamic>> perfumeList = []; for (int i = 0; i < perfumes.length; i++) { perfumeList.add({ 'name': perfumeName[i], 'brand': perfumeBrand[i], 'imageUrl': perfumeImg[i], 'pageUrl': perfumeLink[i], }); } // 转换为JSON字符串 String jsonString = jsonEncode(perfumeList); print(jsonString); }
我给
attributes['src']和attributes['href']加了?? ''做空安全处理,如果你确定这些属性一定存在,也可以用!断言非空,但前者会让代码更健壮。
这样就能顺利提取到small标签的文本,并且生成你需要的JSON对象啦!
内容的提问来源于stack exchange,提问作者John Doah
相关产品推荐
相关产品推荐

