#html-parser #html5ever #sxd-xpath #sxd-document

sxd_html

为 sxd_document 添加 HTML 解析支持。这可以让你在 HTML 文档上评估 XPath 表达式。

3 个版本

0.1.2 2024 年 8 月 10 日
0.1.1 2023 年 1 月 4 日
0.1.0 2022 年 12 月 27 日

#375网页编程

Download history 5/week @ 2024-04-29 4/week @ 2024-05-06 2/week @ 2024-05-20 7/week @ 2024-05-27 9/week @ 2024-06-03 13/week @ 2024-06-10 24/week @ 2024-06-17 2/week @ 2024-06-24 8/week @ 2024-07-01 4/week @ 2024-07-08 5/week @ 2024-07-15 60/week @ 2024-07-29 107/week @ 2024-08-05 37/week @ 2024-08-12

每月下载量 205
3 个 Crates 中使用 (2 个直接使用)

MIT/Apache 许可协议

34KB
664

sxd_html

crates.io tests codecov license

使用 html5ever 解析 html 并将其转换为 sxd_document::Package 以与 sxd_xpath 一起使用。

示例

use sxd_xpath::{nodeset::Node, Context, Error, Factory, Value};

fn main() -> anyhow::Result<()> {
    let contents = reqwest::blocking::get("https://github.com/trending")?.text()?;
    let package = sxd_html::parse_html(&contents);
    let document = package.as_document();

    let mut trending_repos: Vec<String> = Default::default();
    let repo_as = match evaluate_xpath_node(document.root(), "//article/h1/a")? {
        Value::Nodeset(set) => set,
        _ => panic!("Expected node set"),
    }
    .document_order();

    for repo_a in repo_as {
        let user = evaluate_xpath_node(repo_a, "./span/text()")?.into_string();
        let name = repo_a
            .children()
            .last()
            .unwrap()
            .text()
            .map(|t| t.text())
            .unwrap_or_default();
        trending_repos.push(format!("{}{}", user.trim(), name.trim()));
    }

    println!("Trending Repos :");
    for name in trending_repos {
        println!("\t{}", name);
    }

    Ok(())
}

fn evaluate_xpath_node<'d>(node: impl Into<Node<'d>>, expr: &str) -> Result<Value<'d>, Error> {
    let factory = Factory::new();
    let expression = factory.build(expr)?;
    let expression = expression.ok_or(Error::NoXPath)?;

    let context = Context::new();

    expression
        .evaluate(&context, node.into())
        .map_err(Into::into)
}

输出 (2021 年 1 月 7 日)

Trending Repos :
	GTAmodding /re3
	jina-ai /jina
	JetBrains /kotlin
	freefq /free
	prisma /prisma
	rcmaehl /WhyNotWin11
	bytedance /lightseq
	covidpass-org /covidpass
	pi-apps /pi-platform-docs
	yangshun /front-end-interview-handbook
	amit-davidson /awesome-golang-workshops
	mhadidg /software-architecture-books
	30-seconds /30-seconds-of-code
	GokuMohandas /MadeWithML
	dataease /dataease
	ffffffff0x /Digital-Privacy
	trekhleb /javascript-algorithms
	PaddlePaddle /PaddleX
	SigNoz /signoz
	sudheerj /reactjs-interview-questions
	EdgeSecurityTeam /Vulnerability
	dastergon /awesome-sre
	PowerShell /PowerShell
	CorentinJ /Real-Time-Voice-Cloning
	csseky /cskaoyan

注意

此库使用 html5ever 解析 html。因此,你需要遵循 html5ever 的约束。例如,你需要注意如何处理 <table> 标签。

<table>
    <tr>
        <td>1</td>
        <td>2</td>
    </tr>
    <tr>
        <td>3</td>
        <td>4</td>
    </tr>
</table>

将被解释为

<table>
    <tbody>
        <tr>
            <td>1</td>
            <td>2</td>
        </tr>
        <tr>
            <td>3</td>
            <td>4</td>
        </tr>
    </tbody>
</table>

因此,如果你运行查询 //table/tr/td,你将不会得到被 tbody 隐藏的 td。你需要运行查询 //table/tbody/tr/td

许可证

许可协议为以下之一:

由您选择。

贡献

除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,如 Apache-2.0 许可协议中定义,应如上所述双重许可,而无需附加条款或条件。

依赖关系

~1.4–6.5MB
~38K SLoC