Web Scraping 是一种用于从网站中提取数据的技术。它有助于自动化从网站和 HTML 文件中提取数据的过程。作为 C# 开发人员,我们可以轻松地从网页中检查、捕获和提取数据,例如图像、视频、音频等。在本文中,我们将学习如何使用 C# 通过 HTML 解析执行网页抓取。
本文将涵盖以下主题:
C# 网页抓取 API
对于 HTML 文件或 URL 的网络抓取,我们将使用 Aspose.HTML for .NET API。它是一种高级 HTML 处理 API,无需任何外部软件即可生成、修改、提取数据、转换和渲染 HTML 文档。请下载 API 的 DLL 或使用 NuGet 安装它。
PM> Install-Package Aspose.Html
使用 C# 读取和提取 HTML
我们可以按照以下步骤从任何 HTML 文档中读取和提取 HTML:
- 使用 HTMLDocument 类加载 HTML 文档。
- 将文件的内部 HTML 显示到控制台。
以下代码示例展示了如何使用 C# 读取和提取 HTML 内容。
// 此代码示例演示如何显示 HTML 文档的内容
// 加载 HTML 文档
var document = new HTMLDocument(@"D:\Files\html\input.html");
// 显示文档的内部 HTML
Console.WriteLine(document.Body.InnerHTML);
同样,我们可以从实时网站中读取和提取 HTML,如下所示:
// 此代码示例演示如何显示来自实时网站 URL 的内容。
// 初始化网址
Url url = new Url("https://en.wikipedia.org/wiki/HTML");
// 使用 Url 实例加载 HTML 文件
HTMLDocument document = new HTMLDocument(url);
// 向控制台显示文件的内部 HTML
Console.WriteLine(document.Body.InnerHTML);
使用 C# 检查文档元素
我们可以按照以下步骤检查文档及其元素:
- 使用 HTMLDocument 类加载 HTML 文档。
- 获取文档的 HTML 元素。
- 获取 HTML 元素的第一个/最后一个元素。
- 显示元素详细信息,例如 TagName、TextContent。
以下代码示例展示了如何使用 C# 检查文档元素。
// 此代码示例演示如何检查 HTML 元素。
// 从文件加载文档
string documentPath = @"D:\Files\html\input.html";
HTMLDocument document = new 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# 中使用过滤器查找特定元素
我们可以使用自定义过滤器来查找特定元素,例如获取所有图像、链接等。为此,API 提供了 TreeWalker 接口。它允许使用由 whatToShow 标志和过滤器(如果有)定义的文档视图来导航文档树或子树。我们可以按照以下步骤使用过滤器找到特定元素:
- 使用 NodeFilter 类定义过滤器并覆盖 AcceptNode() 方法。
- 使用 HTMLDocument 类加载 HTML 文档。
- 调用 CreateTreeWalker() 方法。它以根节点、要显示的内容和 NodeFilter 作为参数。
以下代码示例展示了如何使用 C# 查找特定元素。
// 此代码示例演示如何使用过滤器查询数据。
// 加载 HTML 文档
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");
// 要启动 HTML 导航,我们需要创建一个 TreeWalker 实例。
// 指定参数表示从文档根开始走,
// 迭代所有节点并使用我们自定义的过滤器实现
using (var iterator = document.CreateTreeWalker(document, Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
{
while (iterator.NextNode() != null)
{
// 由于我们使用的是我们自己的过滤器,因此当前节点将始终是 HTMLImageElement 的一个实例。
// 所以,我们在这里不需要额外的验证。
var image = (HTMLImageElement)iterator.CurrentNode;
System.Console.WriteLine(image.Src);
// 输出:image1.png
// 输出:image2.png
}
}
// 此代码示例演示如何定义节点过滤器。
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;
}
}
使用 C# 从 HTML 查询数据
我们还可以按照以下步骤使用 XPath Query 从 HTML 文档中查询数据:
- 使用 HTMLDocument 类加载 HTML 文档。
- 调用 Evaluate() 方法。它将 XPath 表达式字符串、文档和类型作为参数。
- 最后,遍历生成的节点并显示文本
以下代码示例展示了如何使用 C# 使用 XPath 查询来查询数据。
// 此代码示例演示如何使用 XPath 查询来查询数据。
// 准备 HTML 代码
var code = @"
<div class='happy'>
<div>
<span>Hello!</span>
</div>
</div>
<p class='happy'>
<span>World</span>
</p>
";
// 根据准备好的代码初始化一个文档
HTMLDocument document = new HTMLDocument(code, ".");
// 这里我们评估选择所有子 SPAN 元素的 XPath 表达式
// 来自“class”属性等于“happy”的元素:
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 选择器提取 HTML 内容。为此,API 提供了 QuerySelectorAll() 方法,该方法允许在 HTML 文档中导航并搜索所需的元素。它将查询选择器作为参数并返回所有元素的匹配 NodeList。我们可以按照以下步骤使用 CSS 选择器进行查询:
- 使用 HTMLDocument 类加载 HTML 文档。
- 调用 QuerySelectorAll() 方法。它将查询选择器作为参数。
- 最后,遍历生成的元素列表。
以下代码示例展示了如何在 C# 中使用 CSS 选择器提取 HTML 内容。
// 根据准备好的代码初始化一个文档
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");
// 这里我们创建了一个 CSS 选择器来提取所有 div 元素
var elements = document.QuerySelectorAll("div");
// 迭代结果的元素列表
foreach (Aspose.Html.HTMLElement element in elements)
{
System.Console.WriteLine(element.InnerHTML);
}
获得免费许可证
请通过申请 免费的临时许可证 来尝试不受评估限制的 API。
结论
在本文中,我们学习了如何:
- 使用 C# 读取和提取 HTML 文档的内容;
- 检查文档元素并从 HTML 中查找特定元素;
- 查询特定数据并使用 CSS 选择器提取数据。
此外,您可以使用 文档 了解更多关于 Aspose.HTML for .NET API 的信息。如有任何歧义,请随时在 论坛 上与我们联系。