当前位置: 首页 > article >正文

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

✅近期推荐:求职神器

https://bbs.csdn.net/topics/619384540


🔥欢迎大家订阅系列专栏:flutter_鸿蒙next
💬淼学派语录:只有不断的否认自己和肯定自己,才能走出弯曲不平的泥泞路,因为平坦的大路,太tm无趣了!

写在前面

在现代应用中,后端服务经常返回 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 命令来安装这些依赖。

3. 获取 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<String> 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 数据;否则抛出异常。

4. 解析 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<List<String>> 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<String> links = await fetchHtmlAndParse();
            print(links); // 打印所有链接
          },
          child: Text('Fetch and Parse HTML'),
        ),
      ),
    );
  }
}

4.2 解释

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

5. 显示解析结果

解析出数据后,可以将其在 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<HomeScreen> {
  Future<List<String>> 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<List<String>>(
        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 数据是一个简单而强大的功能。通过使用 httphtml 库,我们可以轻松获取和解析 HTML 内容,并在 UI 中显示这些信息。无论是为了数据提取还是用户界面构建,理解如何处理 HTML 数据都将为你的 Flutter 应用提供更多的可能性。

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


http://www.kler.cn/news/364136.html

相关文章:

  • XML\XXE漏洞基本原理
  • 物联网消息队列Emqx日志配置及日志追踪以及Centos7上的rc.local开机不执行、git提交的小问题
  • Android 两种方式实现类似水波扩散效果
  • 使用Python和Matplotlib模拟3D海浪动画
  • 无人机之低空管控技术
  • 鼠标移入盒子,盒子跟随鼠标移动
  • 支持多种数据来源的ocr识别,GOT-OCR2.0模型部署
  • Java基础练习:哥德巴猜想,回文数
  • Python数值计算(32)——simpson 1/3积分公式
  • istio单网格多主集群验证
  • C++学习路线(二十二)
  • 银河麒麟(debian)下安装postgresql、postgis
  • qt配置https请求
  • Django配置路由后,为什么输入http://127.0.0.1:8000/ 网址后报错了?
  • 如何看待AI技术应用前景
  • 登录163邮箱的滑块验证
  • SQL实战测试
  • 【STM32 ADC】
  • 华为云容器引擎(CCE):赋能企业云原生转型
  • OpenHarmony镜像烧录bat脚本工具
  • 【Linux】-学习笔记01
  • A survey of loss functions for semantic segmentation——论文笔记
  • TCP 攻击为何在 DDoS 攻击中如此常见
  • SQL注入-联合查询
  • 通知服务刷新本地缓存的实现方案
  • sql-labs靶场第二十一关测试报告