需要一些关于HTML Agility Pack入门的说明

时间:2013-01-03 03:58:50

标签: html-agility-pack

我的背景

在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/easily-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文件包含9个文件夹,每个文件夹都有不同的文件副本。我想要哪一个?

以下是文件夹的名称;

  • Net20
  • Net40
  • Net40的客户端
  • Net45
  • SL3-WP
  • SL4
  • SL4-windowsphone71
  • SL5
  • winrt45

2。)在stackoverflow.com/questions/846994/how-to-use-html-agility-pack上对论坛问题“如何使用HTML Agility Pack”的回答指示提问者“下载并构建HTML Agility Pack解决方案“,并将提问者引导到网站htmlagilitypack.codeplex.com,该网站随后有一个指向nuget.org/packages/HtmlAgilityPack的链接,该链接通过运行命令”PM>“来”安装“HTMLAgilityPack。 “包管理器控制台”中的“安装包HtmlAgilityPack”

这一切意味着什么?其他网站说要在bin文件夹中回合dll。那是什么告诉我要做的? 请详细解释,让我开始。

3.)假设我正在使用C#,我应该创建哪种项目?

4.请告诉我您认为适用于我的项目的任何其他资源。

1 个答案:

答案 0 :(得分:1)

考虑到您在计算机上安装的.NET框架版本,您似乎可以创建.NET 4.0项目。什么类型的项目取决于您希望应用程序如何运行。我个人选择创建一个包含load html和scrub代码的C#类库项目,然后以你想用来实际打开文件的任何机制托管它。

要从FileSystem打开文件,请使用System.IO.File中的File.OpenReadFile.ReadAllText。您可以将流或文件内容传递给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版本更容易实现。

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

  • 你的确可以download the sources from the CodePlex website。无论你如何继续,你可能想要以任何方式这样做,它允许你深入了解并解决为什么某些东西按照它的方式工作,即使你没有自己编译库。
  • 您可以从CodePlex下载二进制文件并将它们与您的项目一起存储,然后在创建NuGet等服务之前,这是开发人员分发其库的唯一简便方法。
  • 我个人选择去NuGet路线。当您使用Visual Studio 2012时,NuGet已与Visual Studio集成。当您使用Visual Studio 2010时,you'll have to install the NuGet extension可以获得相同的功能。安装完成后,您可以open the Nuget Package manager Console from within Visual Studio。打开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(the XML/XPath documentation from MSDN actually applies here):

 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-to-Html和Linq查询语法:

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

您可以根据需要进行搜索。语法类似于.NET Framework中的标准XPathnavigator语法(使用SelectNodes / SelectSingleNode / Children等)或Linq-to-XML语法(使用.Descendants / .Ancesters / .Element(s)和标准Linq。

另见: