65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (5投票s)

2024年4月21日

MIT

2分钟阅读

viewsIcon

10266

downloadIcon

160

使用 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日 - 初始提交
© . All rights reserved.