<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解

简介: 本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。

写在前面
在现代应用中,后端服务经常返回 HTML 数据,特别是在进行 web scraping 或处理某些 API 时。Flutter 提供了强大的工具来处理和解析这些数据。本文将深入探讨如何在 Flutter 中解析后端返回的 HTML 数据,使用的工具和步骤,以及一些实际的示例。

  1. 什么是 HTML 解析?
    HTML 解析是将 HTML 文档转换为结构化的数据,以便程序可以方便地访问和操作。这在处理来自网络的内容时尤为重要,特别是当你需要提取特定的信息时。

  2. Flutter 中的 HTML 解析库
    在 Flutter 中,有几个流行的库可以帮助解析 HTML 数据:

html: 提供 DOM 操作和解析功能。
http: 用于发送 HTTP 请求,获取 HTML 数据。
2.1 添加依赖
在 pubspec.yaml 文件中添加以下依赖:

yaml

dependencies:
flutter:
sdk: flutter
http: ^0.14.0
html: ^0.15.0
运行 flutter pub get 命令来安装这些依赖。

  1. 获取 HTML 数据
    使用 http 库从后端获取 HTML 数据。下面是一个简单的示例,演示如何从某个 URL 获取 HTML 内容。

3.1 获取 HTML 示例
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void main() {
runApp(MyApp());
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'HTML Parsing Demo',
home: HomeScreen(),
);
}
}

class HomeScreen extends StatelessWidget {
Future fetchHtml() async {
final response = await http.get(Uri.parse('https://example.com'));

if (response.statusCode == 200) {
  return response.body;
} else {
  throw Exception('Failed to load HTML');
}

}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('HTML Parsing Demo')),
body: Center(
child: ElevatedButton(
onPressed: () async {
String htmlContent = await fetchHtml();
print(htmlContent);
},
child: Text('Fetch HTML'),
),
),
);
}
}

3.2 解释
使用 http.get 方法获取指定 URL 的 HTML 内容。
如果请求成功(状态码为 200),则返回 HTML 数据;否则抛出异常。

  1. 解析 HTML 数据
    获取 HTML 数据后,下一步是解析它。使用 html 库可以轻松实现这一点。

4.1 解析 HTML 示例
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' as html_parser;

void main() {
runApp(MyApp());
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'HTML Parsing Demo',
home: HomeScreen(),
);
}
}

class HomeScreen extends StatelessWidget {
Future> fetchHtmlAndParse() async {
final response = await http.get(Uri.parse('https://example.com'));

if (response.statusCode == 200) {
  // 解析 HTML
  var document = html_parser.parse(response.body);
  // 查找特定的元素,例如获取所有的链接
  var links = document.getElementsByTagName('a');
  return links.map((link) => link.attributes['href']).toList();
} else {
  throw Exception('Failed to load HTML');
}

}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('HTML Parsing Demo')),
body: Center(
child: ElevatedButton(
onPressed: () async {
List links = await fetchHtmlAndParse();
print(links); // 打印所有链接
},
child: Text('Fetch and Parse HTML'),
),
),
);
}
}

4.2 解释
使用 html_parser.parse 方法解析获取的 HTML 内容。
通过 document.getElementsByTagName('a') 获取所有的链接元素,提取它们的 href 属性。

  1. 显示解析结果
    解析出数据后,可以将其在 Flutter UI 中显示出来。例如,我们可以使用 ListView 来显示获取的链接列表。

5.1 显示链接的示例
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' as html_parser;

void main() {
runApp(MyApp());
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'HTML Parsing Demo',
home: HomeScreen(),
);
}
}

class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State {
Future> fetchHtmlAndParse() async {
final response = await http.get(Uri.parse('https://example.com'));

if (response.statusCode == 200) {
  var document = html_parser.parse(response.body);
  var links = document.getElementsByTagName('a');
  return links.map((link) => link.attributes['href']).toList();
} else {
  throw Exception('Failed to load HTML');
}

}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('HTML Parsing Demo')),
body: FutureBuilder>(
future: fetchHtmlAndParse(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
} else {
final links = snapshot.data ?? [];
return ListView.builder(
itemCount: links.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(links[index] ?? 'No link'),
);
},
);
}
},
),
);
}
}

5.2 解释
使用 FutureBuilder 来异步处理获取和解析 HTML 数据。
根据不同的 ConnectionState 显示加载指示器、错误信息或链接列表。
写在最后
在 Flutter 中解析后端返回的 HTML 数据是一个简单而强大的功能。通过使用 http 和 html 库,我们可以轻松获取和解析 HTML 内容,并在 UI 中显示这些信息。无论是为了数据提取还是用户界面构建,理解如何处理 HTML 数据都将为你的 Flutter 应用提供更多的可能性。

希望这篇博客对你有所帮助,欢迎评论与讨论!
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/lbcyllqj/article/details/143223577

目录
相关文章
|
9月前
|
监控 JavaScript 编译器
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。
1025 93
HarmonyOS NEXT仓颉开发语言实战案例:外卖App
仓颉语言实战分享,教你如何用仓颉开发外卖App界面。内容包括页面布局、导航栏自定义、搜索框实现、列表模块构建等,附完整代码示例。轻松掌握Scroll、List等组件使用技巧,提升HarmonyOS应用开发能力。
|
12月前
|
移动开发 前端开发 JavaScript
鸿蒙NEXT时代你所不知道的全平台跨端框架:CMP、Kuikly、Lynx、uni-app x等
本篇基于当前各大活跃的跨端框架的现状,对比当前它们的情况和未来的可能,帮助你在选择框架时更好理解它们的特点和差异。
1178 0
|
安全 API 开发工具
【HarmonyOS NEXT】一键扫码功能
这些Kit为我们应用开发提升了极大地效率。很多简单的功能,如果不需要太深的定制化需求,直接调用kit提供的API就可以实现,在android或者ios上需要很多代码才能实现的功能效果。
366 0
HarmonyOS NEXT仓颉开发语言实战案例:电影App
周末好!本文分享使用仓颉语言重构ArkTS实现的电影App案例,对比两者在UI布局、组件写法及语法差异。内容包括页面结构、列表分组、分类切换与电影展示等。通过代码演示仓颉在HarmonyOS开发中的应用。##仓颉##ArkTS##HarmonyOS开发
HarmonyOS NEXT仓颉开发语言实战案例:健身App
本期分享一个健身App首页的布局实现,顶部采用Stack容器实现重叠背景与偏移效果,列表部分使用List结合Scroll实现可滚动内容。代码结构清晰,适合学习HarmonyOS布局技巧。
HarmonyOS NEXT仓颉开发语言实战案例:小而美的旅行App
本文分享了一个旅行App首页的设计与实现,使用List容器搭配Row、Column布局完成个人信息、功能列表及推荐模块的排版,详细展示了HarmonyOS下的界面构建技巧。
|
10月前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
387 1
|
10月前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
861 1
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
10月前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
536 1

推荐镜像

更多
  • DNS