使用 Visual FA 抓取网页的简单示例






4.90/5 (5投票s)
使用 Visual FA 抓取网页非常简单。以下是一个示例。
引言
我编写这个示例是为了演示使用 Visual FA 执行诸如抓取网页之类的操作是多么容易。我认为一个简单的示例在理解如何使用它方面会很有帮助。
背景
Visual FA 是我的 C# 词法分析/标记化引擎。它本质上是一个增强的正则表达式引擎。与 .NET 内置的引擎不同,这个引擎是为性能而非功能而构建的,因此它不具备回溯或捕获等功能。此外,它也比 .NET 的引擎运行效率更高。更重要的是,它可以进行标记化,而 .NET 的引擎仅仅是一个匹配器。
在这里,我们使用它来抓取网页。这非常简单,通常你会对结果进行词法分析/标记化,而不是进行简单的平面匹配。
使用代码
Scrape 项目包含在 Visual FA 中。
这是一个从 google.com 提取所有 URL 的简单示例
using VisualFA;
var expr = FA.Parse(@"https?\://[^"";\)]+");
var client = new HttpClient();
using (var msg = new HttpRequestMessage(HttpMethod.Get, "https://www.google.com"))
{
using (var resp = client.Send(msg))
{
using (var reader = new StreamReader(resp.Content.ReadAsStream()))
{
foreach (var match in expr.Run(reader))
{
if (match.IsSuccess)
{
Console.WriteLine(match.Value);
}
}
}
}
}
这将把每个 http 或 https URL 打印到控制台。关键在于,我们正在从正则表达式 https?\://[^";\)]+
启动一个状态机。该表达式的意思是查找 http:// 或 https://,并继续匹配直到找到引号、分号或闭合括号。一旦调用了 Parse()
,我们就可以使用 FA
实例的 Run()
方法来返回一系列 FAMatch
对象。这可以在 TextReader
上完成,如上所示,也可以在 string
上完成。像 Visual FA 的词法分析器返回所有内容,但我们只关心成功的匹配,因此我们检查 IsSuccess
属性来决定是否打印 Value
。
显然,您可以使用 .NET 的引擎来做到这一点,但这需要先将整个页面读入内存才能进行匹配,并且与使用 Visual FA 相比,结果的性能会略逊一筹。这本身并不能证明使用 Visual FA 的合理性,但通常您会使用它来词法分析内容,这已经在 Visual FA 系列中介绍过了。
历史
- 2024年4月21日 - 初始提交