首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在flutter中从flutterWebViewPlugin ( webview )获取html内容

如何在flutter中从flutterWebViewPlugin ( webview )获取html内容
EN

Stack Overflow用户
提问于 2020-04-05 22:51:14
回答 3查看 9.9K关注 0票数 6

我的问题很简单。如何从webview中加载的页面中获取html数据。数据为JSON格式。出于某种原因,我不能在这里对任何get请求使用post请求,因此我只需要使用webview获取数据。如何做到这一点?

代码语言:javascript
运行
复制
flutterWebViewPlugin.onUrlChanged.listen((String url) {
      if (url.contains('/recon?')) {
        print('printing url : $url');
        // need to get data ( html content ) on this url
        flutterWebViewPlugin.close();
        Navigator.of(context).pop(url);
      }
    });
});
代码语言:javascript
运行
复制
WebviewScaffold(
                userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0",
                url: myurl,               
              )
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-13 14:35:29

对我来说,答案是从url而不是从html content获取令牌,因为我不能正确地提取它并得到错误

代码语言:javascript
运行
复制
[VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: FormatException: Unexpected character (at character 1)
<html><head></head><body><pre style="word-wrap: break-word; white-space: pr...
^

因此,对于我来说,一开始起作用的是以下解决方案:

代码语言:javascript
运行
复制
WebView(
          userAgent: "random",
          initialUrl: mainUrl,
          onWebViewCreated: (controller) {
            _controller = controller;
            print(_controller.currentUrl());
          },
          javascriptMode: JavascriptMode.unrestricted,
          gestureNavigationEnabled: true,
          onPageFinished: (_) {
            _controller.currentUrl().then(
              (url) {
                if (url.contains("recon?")) {
                  var token = url.split('recon?')[1];
                  _prefs.setString('token', token);
                }
                if (url.contains("dashboard")) {
                  _controller.clearCache();
                  _controller.loadUrl(mainUrl);
                }
              },
            );
          },
        ),

在这里,我们获取url,根据关键字将其拆分,然后存储另一半,即令牌并继续。我可以用两种方式做到这一点,也就是用flutter_webview_pluginflutter_inappwebview,这是相同的过程,但网址的事情只对我有效。提取上下文没有这样做,所以它们不会被标记为答案,而是帮助我理解可能性的一张向上的选票。

票数 -1
EN

Stack Overflow用户

发布于 2020-08-04 18:21:12

你可以通过官方的webview库来实现:

代码语言:javascript
运行
复制
WebView(
  initialUrl: model.luxtrustUrl,
  onWebViewCreated: (controller) {
    _controller = controller;
  },
  javascriptMode: JavascriptMode.unrestricted,
  gestureNavigationEnabled: true,
  onPageFinished: (_) {
    readJS();
    model.hideProgress();
  },
)

void readJS() async{
    String html = await _controller.evaluateJavascript("window.document.getElementsByTagName('html')[0].outerHTML;");    
    print(html);
}
票数 12
EN

Stack Overflow用户

发布于 2020-06-03 16:41:55

您可以使用my plugin flutter_inappwebview,它是一个Flutter插件,允许您添加内联WebViews或打开应用内浏览器窗口,它有许多事件、方法和选项来控制WebViews。

要获取超文本标记语言数据,只需在onLoadStop事件中使用var html = await controller.evaluateJavascript(source: "window.document.getElementsByTagName('html')[0].outerHTML;");即可。

下面是一个使用userAgent的示例

代码语言:javascript
运行
复制
import 'dart:async';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(new MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {
  InAppWebViewController webView;
  String myurl = "https://github.com/flutter";

  @override
  void initState() {
    super.initState();
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('InAppWebView Example'),
        ),
        body: Container(
            child: Column(children: <Widget>[
              Expanded(
                  child: InAppWebView(
                    initialUrl: myurl,
                    initialHeaders: {},
                    initialOptions: InAppWebViewGroupOptions(
                      crossPlatform: InAppWebViewOptions(
                        debuggingEnabled: true,
                        userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0"
                      ),
                    ),
                    onWebViewCreated: (InAppWebViewController controller) {
                      webView = controller;
                    },
                    onLoadStart: (InAppWebViewController controller, String url) {

                    },
                    onLoadStop: (InAppWebViewController controller, String url) async {
                      if (url.contains('/recon?')) {
                        // if JavaScript is enabled, you can use
                        var html = await controller.evaluateJavascript(
                            source: "window.document.getElementsByTagName('html')[0].outerHTML;");

                        log(html);
                      }
                    },
                  ))
            ])),
      ),
    );
  }
}

只需将myurl变量设置为您的url。

通过window.document.getElementsByTagName('html')[0].outerHTML;,你将获得所有的超文本标记语言字符串。相反,如果您只需要正文文本,则可以使用window.document.body.innerText;更改它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61044466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档