やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rust自習(Webスクレイピング scraper 1)

 サクッとできた。

成果物

情報源

クレート作成

$ cargo new scraper_hello

Cargo.toml

[dependencies]
scraper = "0.9"

 初回ビルドしてダウンロード&コンパイル

$ cargo build

main.rs

fn main() {
    let html = r#"
<html>
    <body>
        <div class="ssss"><ul><li name="nn">NotSelect</li></ul></div>
        <div class="some-list">
            <ul>
                <li name="n1">item1</li>
                <li          >item2</li>
                <li name="n3">item3</li>
            </ul>
        </div>
    </body>
</html>"#;
    let doc = scraper::Html::parse_document(html);
    let sel = scraper::Selector::parse("div.some-list ul li[name]").unwrap();
//    println!("{:?}", doc.select(&sel));
    for node in doc.select(&sel) {
        println!("{:?}", node.value().name());       // 要素名
        println!("{:?}", node.value().attr("name")); // 属性の取得
        println!("{:?}", node.inner_html());         // テキストノードの取得
        println!("{:?}", node.text().collect::<Vec<_>>());    // テキストノードの取得
        println!("{:?}", node.text().collect::<Vec<_>>()[0]); // テキストノードの取得
    }
}

実行

"li"
Some("n1")
"item1"
["item1"]
"item1"
"li"
Some("n3")
"item3"
["item3"]
"item3"

所感

 コードはdocsが参考になった。docsのURLをみると0.10.1とある。crates.ioには0.9とあったのに。githubにあったCargo.tomlをみると0.10.1とあった。crates.ioに表示されるバージョンは最新とは限らないらしい。

 テキストノードの取得が冗長すぎる。node.text()だけで取得できて欲しかったのだが。inner_text()の場合は内部にHTMLタグがあるとそれもそのまま取得できてしまう。でも一番楽。

 属性もnode.attr("name")だけで取得できて欲しかった。テキストノードはvalue()なしで、要素のときはvalue()が必要とか、わかりにくい。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで