3 个版本
0.1.2 | 2024 年 8 月 10 日 |
---|---|
0.1.1 | 2023 年 1 月 4 日 |
0.1.0 | 2022 年 12 月 27 日 |
#375 在 网页编程
每月下载量 205
在 3 个 Crates 中使用 (2 个直接使用)
34KB
664 行
sxd_html
使用 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 版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可协议 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,如 Apache-2.0 许可协议中定义,应如上所述双重许可,而无需附加条款或条件。
依赖关系
~1.4–6.5MB
~38K SLoC