【Flutter】Flutterで基本的なスクレイピングをする方法
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);