【Flutter】Flutterで基本的なスクレイピングをする方法

1 min読了の目安(約1600字TECH技術記事

Universal_htmlは、クロスプラットフォームで動作するHTML/XMLパーサーです。
内部ブラウザを備えており、フォームの送信などのブラウザ自動操作も可能です。

インストール

pubspec.yamlに依存関係を追記します。

dependencies:
    universal_html: ^1.2.1

インポート

import 'package:universal_html/html.dart' as html;
import 'package:universal_html/driver.dart' as driver;

単一の要素を取得

querySelector()メソッドで単一の要素を取得できます。
以下はtitleタグを取得する例です。

main.dart
onPressed: () async {
    final client = driver.HtmlDriver();
    final url = "https://example.com";
              
    // Webページを取得
    await client.setDocumentFromUri(Uri.parse(url));

    // タイトルを取得
    final title = client.document.querySelector("title").text;

    print(title);
},

複数の要素を取得

querySelectorAll()メソッドで単一の要素を取得できます。
以下はページ内のすべてのaタグのテキストとURLを取得する例です。

main.dart
onPressed: () async {
    final client = driver.HtmlDriver();
    final url = "https://example.com";
              
    // Webページを取得
    await client.setDocumentFromUri(Uri.parse(url));

    // すべてのaタグを取得
    final elements = client.document.querySelectorAll("a");

    for (final elem in elements) {
        print(elem.text);
        print(elem.getAttribute("href"));
    }
},

要素の選択

querySelector()querySelectorAll()はCSSセレクタで対象の要素を選択します。

client.document.querySelectorAll(".entry > div");
client.document.querySelectorAll("img");
client.document.querySelector(".main > #greeting > span");

要素を解析

// HTMLを取得
element.innerHtml;
element.outerHtml;

// テキストを取得
element.text;
element.innerText;

// nameに一致する属性を取得
element.getAttribute(name);

// nameに一致する属性が存在するかを判定
bool isExists = element.hasAttribute(name);