Web Scraping,也称为网络爬虫、网络收获或数据抓取,用于从网站中提取数据。网络爬虫使用不同的数据选择器,如 CSS 选择器、XPath 或两者兼而有之,以便从网页中提取数据。这两种选择器对于收集和分析来自网络的信息都很有效。本文介绍如何使用 C# 创建 Web 抓取工具,特别是有关 HTML 导航、XPath 查询和 CSS 选择器的信息。
C# Web 抓取库配置
Aspose.HTML for .NET 是一个 Web 抓取库,可以通过从 New Releases 部分下载参考 DLL 文件或运行以下 NuGet 安装命令轻松配置:
PM> Install-Package Aspose.Html
在 C# 中使用 HTML 导航进行网页抓取
您可以使用 Node 类的不同属性来导航 HTML 文档。下面的代码片段解释了如何在 C# 中导航 HTML 网页:
// 准备 HTML 代码
var html_code = "<span>Hello</span> <span>World!</span>";
// 从准备好的代码初始化一个文档
using (var document = new Aspose.Html.HTMLDocument(html_code, "."))
{
// 获取对 BODY 的第一个孩子(第一个 SPAN)的引用
var element = document.Body.FirstChild;
Console.WriteLine(element.TextContent); // output: Hello
// 获取对html元素之间空白的引用
element = element.NextSibling;
Console.WriteLine(element.TextContent); // output: ' '
// 获取对第二个 SPAN 元素的引用
element = element.NextSibling;
Console.WriteLine(element.TextContent); // output: World!
}
检查 HTML 文档及其元素
该 API 还提供了元素遍历功能的通用用法。以下代码片段演示了如何对 API 的不同元素进行详细检查。
//从文件加载文档
string documentPath = System.IO.Path.Combine(DataDir, "html_file.html");
// 在本地文件系统中指定源 HTML 文件的路径
using (var document = new Aspose.Html.HTMLDocument(documentPath))
{
// 获取文档的html元素
var element = document.DocumentElement;
Console.WriteLine(element.TagName); // HTML
// 获取html元素的最后一个元素
element = element.LastElementChild;
Console.WriteLine(element.TagName); // BODY
// 获取body元素的第一个元素
element = element.FirstElementChild;
Console.WriteLine(element.TagName); // H1
Console.WriteLine(element.TextContent); // Header 1
}
C# 中 Web Scraper 的自定义过滤器用法
您可以使用 ITreeWalker 或 INodeIterator 接口对象以及自定义过滤器实现来实现自定义过滤器。以下代码片段说明了如何遵循该过程:
class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
public override short AcceptNode(Aspose.Html.Dom.Node n)
{
// 当前过滤器会跳过除 IMG 元素之外的所有元素。
return string.Equals("img", n.LocalName)
? FILTER_ACCEPT
: FILTER_SKIP;
}
}
实现自定义过滤器后,您可以使用以下代码快速导航网页:
var code = @"
<p>Hello</p>
<img src='image1.png'>
<img src='image2.png'>
<p>World!</p>";
// 根据准备好的代码初始化一个文档
using (var document = new Aspose.Html.HTMLDocument(code, "."))
{
// 要启动 HTML 导航,我们需要创建一个 TreeWalker 实例。
// 指定的参数意味着它从文档的根开始遍历,遍历所有节点并使用我们自定义的过滤器实现
using (var iterator = document.CreateTreeWalker(document, Aspose.Html.Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
{
while (iterator.NextNode() != null)
{
// 由于我们使用的是我们自己的过滤器,因此当前节点将始终是 HTMLImageElement 的一个实例。
// 所以,我们在这里不需要额外的验证。
var image = (Aspose.Html.HTMLImageElement)iterator.CurrentNode;
System.Console.WriteLine(image.Src);
// 输出:image1.png
// 输出:image2.png
}
}
}
在 C# 中使用 XPath 查询进行 Web 抓取
XPath 可用于从 HTML 文档中提取数据。以下代码片段详细说明了如何在 C# 中使用 XPath Query 进行 Web 抓取:
// 准备 HTML 代码
var code = @"
<div class='happy'>
<div>
<span>Hello!</span>
</div>
</div>
<p class='happy'>
<span>World</span>
</p>
";
// 根据准备好的代码初始化一个文档
using (var document = new Aspose.Html.HTMLDocument(code, "."))
{
// 在这里,我们评估 XPath 表达式,我们从“class”属性等于“happy”的元素中选择所有子 SPAN 元素:
var result = document.Evaluate("//*[@class='happy']//span",
document,
null,
Aspose.Html.Dom.XPath.XPathResultType.Any,
null);
// 迭代结果节点
for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
{
System.Console.WriteLine(node.TextContent);
// 输出:你好
// 输出:世界!
}
}
在 C# 中使用 CSS 选择器进行网页抓取
您可以根据 CSS 选择器语法创建搜索模式来匹配文档树中的元素。下面的代码片段解释了如何在 C# 中使用 CSS 选择器执行网页抓取:
// 准备 HTML 代码
var code = @"
<div class='happy'>
<div>
<span>Hello</span>
</div>
</div>
<p class='happy'>
<span>World!</span>
</p>
";
// 根据准备好的代码初始化一个文档
using (var document = new Aspose.Html.HTMLDocument(code, "."))
{
// 在这里,我们创建了一个 CSS 选择器,用于提取所有 'class' 属性等于 'happy' 的元素及其子 SPAN 元素
var elements = document.QuerySelectorAll(".happy span");
// 迭代结果的元素列表
foreach (Aspose.Html.HTMLElement element in elements)
{
System.Console.WriteLine(element.InnerHTML);
// 输出:你好
// 输出:世界!
}
}
获得免费许可证
您可以申请 免费临时许可证 来评估 API 的全部功能。
结论
在本文中,您了解了 C# Web 抓取库 Aspose.HTML for .NET,其中包括几种在 C# 中创建 Web 抓取器的方法。它讨论了 HTML 导航、XPath 查询以及 CSS 选择器方法来实现您的要求。但是,如果您需要讨论您的任何疑虑或问题,请在 论坛 上给我们写信。