4 个版本 (2 个重大变更)
0.3.1 | 2023年1月7日 |
---|---|
0.3.0 | 2022年11月8日 |
0.2.0 | 2021年4月30日 |
0.1.0 | 2021年3月23日 |
#2237 in 网页开发
9KB
112 行
XPATH 捕集器
使使用 XPATH 捕集网站变得更加容易。目前使用 我的 xpath 解析器,该解析器不完整、未文档化,最初用于教学目的。
以下是一个简单的示例,也在 示例文件夹 中
use std::io::Cursor;
use scraper_main::{
xpather,
ConvertFromValue,
ScraperMain,
Scraper,
};
#[derive(Debug, Scraper)]
pub struct RedditList(
// Uses XPATH to find the item containers
#[scrape(xpath = r#"//div[contains(@class, "Post") and not(contains(@class, "promotedlink"))]"#)]
Vec<RedditListItem>
);
#[derive(Debug, Scraper)]
pub struct RedditListItem {
// URL of the post
#[scrape(xpath = r#".//a[@data-click-id="body"]/@href"#)]
pub url: Option<String>,
// Title of the post
#[scrape(xpath = r#".//a[@data-click-id="body"]/div/h3/text()"#)]
pub title: Option<String>,
// When it was posted
#[scrape(xpath = r#".//a[@data-click-id="timestamp"]/text()"#)]
pub timestamp: Option<String>,
// Amount of comments.
#[scrape(xpath = r#".//a[@data-click-id="comments"]/span/text()"#)]
pub comment_count: Option<String>,
// Vote count.
#[scrape(xpath = r#"./div[1]/div/div/text()"#)]
pub votes: Option<String>,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Request subreddit
let resp = reqwest::get("https://www.reddit.com/r/nocontextpics/").await?;
// Return page data.
let data = resp.text().await?;
// Parse request into a Document.
let document = xpather::parse_doc(&mut Cursor::new(data));
// Scrape RedditList struct.
let list = RedditList::scrape(&document, None)?;
// Output the scraped.
println!("{:#?}", list);
Ok(())
}
依赖项
~4–11MB
~114K SLoC