2

我的背景

在 HTML 清理方面,我是新手。自从我使用 C# 为 html 编写唯一的工作以来,已经过去了大约四年。不久前,我使用 C# 进行的其他编码是用于表单来操作 SQL Server 数据库中的数据。

我为尝试开始使用 HTML Agility Pack (HAP) 所做的工作

我花了几天时间试图理解从各种在线资源中找到的关于如何开始使用 HTML Agility Pack 的说明。到目前为止,我发现的一些内容如下:

  • www.4guysfromrolla.com/articles/011211-1.aspx
  • olussier.net/2010/03/30/easy-parse-html-documents-in-csharp/
  • stackoverflow.com/questions/846994/how-to-use-html-agility-pack
  • shatalov.su/en/articles/web/parser_1.php
  • 下面还有更多的提到......

到目前为止我的结果

我发现这些材料与每个来源似乎都在告诉我一些不同的东西。我所有的尝试都走到了尽头。


为了方便大家高效的理清我的困惑,回复我的具体情况,我将在下面我的项目、我的环境和我的问题三个部分进行描述;

我的项目

我的任务是创建一个从 html 文件中清除数据的过程。我很了解这些文件。这些文件将驻留在机器本地的文件系统中。html 文件将由我们不拥有的进程在其他地方创建,并将放置在我刚才提到的本地文件夹中。(仅供参考 - 虽然这不是我的问题的一部分,但我希望创建一个项目或应用程序,该项目或应用程序将按计划运行以执行清理任务,然后将收集的数据输入到数据库表中。)

我的环境

如上所述,要处理的 html 文件将驻留在本地计算机上。我在这台机器上新安装了 Visual Studio 2010 Professional 来为这个项目编写代码。该机器现在可以通过文件共享访问 HTML Agility Pack。

在 REGEIT 下: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP 列出了以下指示本机上安装的 .NET 框架的版本;

  • CDF
  • V2.0.50727
  • V3.0
  • V3.5
  • V4
  • V4.0

我的问题

1.) 一些网站告诉我下载 HTML Agility Pack 并使用文件“HtmlAgilityPack.dll”,但是 zip 文件包含九个文件夹,每个文件夹都有该文件的不同副本。我想要哪一个?

这是文件夹的名称;

  • 网20
  • 网40
  • Net40-客户端
  • 网45
  • sl3-wp
  • SL4
  • sl4-windowsphone71
  • SL5
  • winrt45

2.) 在 stackoverflow.com/questions/846994/how-to-use-html-agility-pack 上对论坛问题“我如何使用 HTML 敏捷包”的回答指示提问者“下载并构建 HTML 敏捷包” Pack Solution”,并将提问者定向到站点 htmlagilitypack.codeplex.com,然后该站点具有指向 nuget.org/packages/HtmlAgilityPack 的链接,该链接表示通过运行命令“PM> Install-Package HtmlAgilityPack”来“安装”HTMLAgilityPack。 “包管理器控制台”</p>

这是什么意思呢?其他网站说要在 bin 文件夹中找到 dll。那是在告诉我该怎么做?请更详细地解释让我开始。

3.) 假设我使用 C# 我应该创建什么样的项目?

4.) 请指导我找到您认为适用于我的项目的任何其他资源。

4

1 回答 1

1

看起来您可以创建一个 .NET 4.0 项目,因为您已在计算机上安装了 .NET 框架版本。什么类型的项目取决于您希望应用程序如何运行。我个人会选择创建一个包含加载 html 和清理代码的 C# 类库项目,然后将其托管在您想要用来实际打开文件的任何机制中。

要从 FileSystem 打开文件,请使用File.OpenReadFile.ReadAllTextSystem.IO.File. 您可以将流或文件内容传递给HtmlDocument.Load/LoadHtml方法。

 HtmlDocument doc = new HtmlDocument();

 // Use File.ReadAllText
 string contents = File.ReadAllText("PathToFileName");
 doc.LoadHtml(contents);

 // Or use a stream
 using (var contents = File.OpenRead("PathToFileName"))
 {
     doc.Load(contents);
 }

托管的可能性很多。控制台应用程序(可以从命令行或通过任务计划程序调用),Windows 服务(可以在 Windows 中加载,即使没有人登录到机器也可以在后台运行,并且可以潜在地使用FileSystemWatcher自动获取文件, 或 Windows Forms/WPF 应用程序,它允许用户选择要处理的文件,然后以某种方式显示结果。

至于如何使用它,这是 Html Agility Pack 的主要问题之一。随着时间的推移,已经添加了新的使用方式,因此实际的库有多种使用方式。您可以采用老式的 XPath 查询路由(这是原始 API),也可以使用 Linq-to-HTML/XML 路由(这是较新的方式)。没有一个比另一个更好,它们都有各自的优势。XPath 解决方案允许您轻松地将查询存储在文本文件中,因此它非常适合可配置的系统,而从开发人员的角度来看,Linq-To-HTML 版本更容易理解。

至于如何下载,这里也有很多选择。

  • 您确实可以从 CodePlex 网站下载源代码。无论您如何进行,您可能希望以任何方式执行此操作,它允许您深入了解并弄清楚为什么某些东西会以它的方式工作,即使您自己不编译库。
  • 您可以从 CodePlex 下载二进制文件并将它们与您的项目一起存储,在创建 NuGet 等服务之前,这是开发人员分发其库的唯一简单方法。
  • 我个人会选择走 NuGet 路线。使用 Visual Studio 2012 时,NuGet 已与 Visual Studio 集成。使用 Visual Studio 2010 时,必须安装 NuGet 扩展才能获得相同的功能。安装后,您可以从 Visual Studio 中打开 Nuget 包管理器控制台。打开 Visual Studio 解决方案并在解决方案资源管理器中选择新创建的类库,然后继续输入Install-Package HtmlAgilityPack命令,让 Visual Studio 为您的项目下载并安装正确版本的 HTML Agility Pack。不用担心选择哪个库,Visual Studio 会为您完成。

既然您已经安装了该库,那么如何使用它完全取决于您所追求的 HTML 清理类型以及您是选择 XPath 还是 Linq-to-HTML 路由。但它通常归结为加载 HTML 文档:

 HtmlDocument doc = new HtmlDocument();
 doc.Load(/* path to file or stream */); or doc.LoadHtml(/*string*/);

在加载文件并捕获任何可能发生的解析错误后,继续使用 XPath 查询 HTML,就像内容实际上是 XML 一样(来自 MSDN 的 XML/XPath 文档实际上适用于此处):

 var nodes = doc.DocumentNode.SelectNodes("//table/tr/td");

或者使用 Linq-to-HTML 进行相同的查询:

 var nodes = doc.DocumentNode.Descendants("table")
           .Select(table => table.Elements("tr").Select(tr => tr.Elements("td")));

或者使用带有 Linq 查询语法的 Linq-to-Html:

var tds = from tables in doc.DocumentNode.Descendants("table")
            from tr in tables.Elements("tr")
            from td in tr.Elements("td")
            select td;

您可以随心所欲地进行查询。该语法类似于XPathnavigator.NET Framework 中的标准语法(使用SelectNodes/ SelectSingleNode/ Childrenetc)或 Linq-to-XML 语法(使用.Descendants/ .Ancesters/.Element(s)和标准 Linq)。

也可以看看:

于 2013-01-11T18:11:22.937 回答