サクッとできた。
成果物
情報源
クレート作成
$ 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()
が必要とか、わかりにくい。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- rustc 1.36.0 (a53f9df32 2019-07-03)
- cargo 1.36.0 (c4fcfb725 2019-05-15)
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
前回まで
- Rust自習(じゃんけんゲーム1)
- Rust自習(双方向リスト1)
- Rust自習(単方向リスト1)
- Rust自習(単方向リスト2)
- Rust自習(単方向リスト3)
- Rust自習(単方向リスト4)
- Rust自習(単方向リスト5)
- Rust自習(単方向リスト6)
- Rust自習(単方向リスト7)
- Rust自習(リストのインタフェースを考える)
- Rust自習(連結リスト1)
- Rust自習(連結リスト2)
- Rust自習(連結リスト3)
- Rust自習(連結リスト4)
- Rust自習(連結リストの取得系インタフェース考察)
- Rust自習(連結リスト5)
- Rust自習(連結リストの取得系インタフェース考察2)
- Rust自習(連結リスト6)
- Rust自習(連結リスト7)
- Rust自習(連結リスト8)
- Rust自習(連結リスト9)
- Rust自習(変数名でイテレートする方法)
- Rust自習(iter、iter_mut実装方法)
- Rust自習(連結リスト10)
- Rust自習(rev()実装できず)
- Rust自習(cycle()実装できず)
- Rust自習(じゃんけんゲーム2)
- Rust自習(じゃんけんゲーム3)
- Rust自習(じゃんけんゲーム4)
- Rust自習(じゃんけんゲーム5)
- Rust自習(じゃんけんゲーム6)
- Rust自習(じゃんけんゲーム7)
- Rust自習(じゃんけんゲーム8)
- Rustのアップデート(rustup update)
- Rust自習(SQLite3 1)
- Rust自習(SQLite3 2)
- Rust自習(SQLite3 3)
- Rust自習(日時 1 chrono)
- Rust自習(日時 2 chrono)
- Rust自習(日時 3 chrono)
- Rust自習(日時 4 chrono)
- Rust自習(日時 5 chrono)
- Rust自習(日時 6 chrono)
- Rust自習(日時 7 chrono)
- Rust自習(std::time::SystemTime)
- Rust自習(std::time::Instant)
- Rust自習(std::time::Duration)
- Rust自習(シリアライズ serde 1)
- JSON5とは?
- Rust自習(シリアライズ serde 2 JSON5)
- Rust自習(シリアライズ serde 3 chrono日時型変換)
- Rust自習(diesel 1 SQLite3 ORM)
- Rust自習(diesel 2 SQLite3 ORM)
- Rust自習(diesel 3 SQLite3 ORM)
- Rust自習(diesel 4 SQLite3 ORM)
- Rust自習(diesel 5 SQLite3 ORM)
- Rust自習(diesel 6 SQLite3 ORM)
- Rust自習(diesel 7 SQLite3 ORM serde,chrono)
- Rust自習(diesel 8 SQLite3 ORM serde,chrono)
- Rustで正規表現(regex 1)
- Rustで正規表現(regex 2)
- Rustで正規表現(regex 3)
- Rustで正規表現(regex 4)
- Rustで正規表現(regex 5)
- Rust自習(人称辞典 1)
- Rust自習(人称辞典 2)
- Rust自習(人称辞典 3)
- Rust自習(人称辞典 4)
- Rust自習(人称辞典 5)
- SQLite3の列からCSVデータを抽出するならLIKEよりGLOBのほうが速いらしい
- Rust自習(人称辞典 6)
- Rust自習(シリアライザ JsonFlex)
- Rust自習(HTTPリクエスト reqwest 1)