2009-05-11 3 views
575

Как использовать HTML Agility Pack?Как использовать пакет гибкости HTML

Документ XHTML недействителен. Вот почему я хотел его использовать. Как использовать его в своем проекте? Мой проект находится на C#.

+74

Этот вопрос был очень полезным для меня. – BigJoe714

+23

Примечание: с помощью Visual Studio, которая обрабатывает NuGet, вы можете щелкнуть правой кнопкой мыши «Ссылки» и выбрать «Управление пакетами NuGet ...», найти «HtmlAgilityPack» и нажать «Установить». Затем перейдите в игру с кодом с помощью инструкции/Import. – patridge

+0

Что касается вышеприведенного комментария от @patridge: я обнаружил, что мне нужно удалить, а затем снова добавить ссылку на HtmlAgilityPack при первом получении проекта из svn через ankhsvn. –

ответ

330
  1. Download и постройте решение HTMLAgilityPack.

  2. В приложении, добавьте ссылку на HTMLAgilityPack.dll в HTMLAgilityPack \ Debug (или Realease) папку \ Bin.

Затем, в качестве примера:

HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 

// There are various options, set as needed 
htmlDoc.OptionFixNestedTags=true; 

// filePath is a path to a file containing the html 
htmlDoc.Load(filePath); 

// Use: htmlDoc.LoadHtml(xmlString); to load from a string (was htmlDoc.LoadXML(xmlString) 

// ParseErrors is an ArrayList containing any errors from the Load statement 
if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0) 
{ 
    // Handle any parse errors as required 

} 
else 
{ 

    if (htmlDoc.DocumentNode != null) 
    { 
     HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body"); 

     if (bodyNode != null) 
     { 
      // Do something with bodyNode 
     } 
    } 
} 

(NB:.. Этот код является только примером и не обязательно лучший/единственный подход Не использовать вслепую в собственном приложении)

Метод HtmlDocument.Load() также принимает поток, который очень полезен при интеграции с другими классами, ориентированными на поток, в платформе .NET. Хотя HtmlEntity.DeEntitize() - еще один полезный метод для правильной обработки html-объектов. (спасибо Мэтью)

HtmlDocument и HtmlNode - это классы, которые вы будете использовать больше всего. Подобно парсеру XML, он предоставляет методы selectSingleNode и selectNodes, которые принимают выражения XPath.

Обратите внимание на логические свойства HtmlDocument.Option??????. Они управляют тем, как методы Load и LoadXML будут обрабатывать ваш HTML/XHTML.

Существует также скомпилированный файл справки под названием HtmlAgilityPack.chm, который имеет полную ссылку для каждого из объектов. Обычно это находится в базовой папке решения.

+11

Также обратите внимание, что Load принимает параметр Stream, что удобно во многих ситуациях. Я использовал его для потока HTTP (WebResponse.GetResponseStream). Другим хорошим способом, который следует знать, является HtmlEntity.DeEntitize (часть пакета Agility Pack). Это необходимо для обработки объектов вручную в некоторых случаях. –

+1

примечание: в последней бета-версии Html Agility Pack (1.4.0 Beta 2 выпущен 3 октября 2009) файл справки был перенесен в отдельную загрузку из-за зависимостей от Sandcastle, DocProject и SDK Visual Studio 2008. – rtpHarry

+0

'SelectSingleNode()' похоже, был удален некоторое время назад –

158

Я не знаю, поможет ли это вам, но я написал несколько статей, в которых представлены основы.

Следующая статья на 95%, я просто должен писать объяснения последних нескольких частей кода Я написал. Если вас это интересует, я постараюсь запомнить его здесь, когда опубликую его.

+15

Наконец закончил эту статью два года спустя :) [Простой способ обнаружение RSS и Atom-каналов на сайтах с помощью HtmlAgilityPack] (http://runtingsproper.blogspot.co.uk/2012/07/a-straightforward-method-to-detecting.html) – rtpHarry

+3

Недавно в _Code Project_ было выпущено очень хорошая статья HTMLAgilityPack. Вы можете прочитать это [здесь] (http://www.codeproject.com/Articles/691119/Html-Agility-Pack-Massive-information-extraction-f) –

59

HtmlAgilityPack использует синтаксис XPath, и хотя многие утверждает, что он плохо документированы, у меня не было никаких проблем использовать его с помощью данного XPath документации: https://www.w3schools.com/xml/xpath_syntax.asp

Чтобы разобрать

<h2> 
    <a href="">Jack</a> 
</h2> 
<ul> 
    <li class="tel"> 
    <a href="">81 75 53 60</a> 
    </li> 
</ul> 
<h2> 
    <a href="">Roy</a> 
</h2> 
<ul> 
    <li class="tel"> 
    <a href="">44 52 16 87</a> 
    </li> 
</ul> 

Я сделал это:

string url = "http://website.com"; 
var Webget = new HtmlWeb(); 
var doc = Webget.Load(url); 
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//h2//a")) 
{ 
    names.Add(node.ChildNodes[0].InnerHtml); 
} 
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//li[@class='tel']//a")) 
{ 
    phones.Add(node.ChildNodes[0].InnerHtml); 
} 
+0

Полностью верно.Он полностью зависит от стандарта XPath. Сначала нужно изучить этот стандарт, и после этого все будет легко. –

+0

Ссылка, предоставленная Вами, больше не предлагается. Вероятно, это новый: http://www.w3schools.com/xsl/xpath_syntax.asp – Piotrek

+0

также я не вижу никакой функции SelectNodes() в объекте DocumentNode. Это переименовано? – Piotrek

4
public string HtmlAgi(string url, string key) 
    { 

     var Webget = new HtmlWeb(); 
     var doc = Webget.Load(url); 
     HtmlNode ourNode = doc.DocumentNode.SelectSingleNode(string.Format("//meta[@name='{0}']", key)); 

     if (ourNode != null) 
     { 


       return ourNode.GetAttributeValue("content", ""); 

     } 
     else 
     { 
      return "not fount"; 
     } 

    } 
4

Главная HTMLAgilityPack код связанные выглядит следующим образом

using System; 
using System.Net; 
using System.Web; 
using System.Web.Services; 
using System.Web.Script.Services; 
using System.Text.RegularExpressions; 
using HtmlAgilityPack; 

namespace GetMetaData 
{ 
    /// <summary> 
    /// Summary description for MetaDataWebService 
    /// </summary> 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [System.Web.Script.Services.ScriptService] 
    public class MetaDataWebService: System.Web.Services.WebService 
    { 
     [WebMethod] 
     [ScriptMethod(UseHttpGet = false)] 
     public MetaData GetMetaData(string url) 
     { 
      MetaData objMetaData = new MetaData(); 

      //Get Title 
      WebClient client = new WebClient(); 
      string sourceUrl = client.DownloadString(url); 

      objMetaData.PageTitle = Regex.Match(sourceUrl, @ 
      "\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value; 

      //Method to get Meta Tags 
      objMetaData.MetaDescription = GetMetaDescription(url); 
      return objMetaData; 
     } 

     private string GetMetaDescription(string url) 
     { 
      string description = string.Empty; 

      //Get Meta Tags 
      var webGet = new HtmlWeb(); 
      var document = webGet.Load(url); 
      var metaTags = document.DocumentNode.SelectNodes("//meta"); 

      if (metaTags != null) 
      { 
       foreach(var tag in metaTags) 
       { 
        if (tag.Attributes["name"] != null && tag.Attributes["content"] != null && tag.Attributes["name"].Value.ToLower() == "description") 
        { 
         description = tag.Attributes["content"].Value; 
        } 
       } 
      } 
      else 
      { 
       description = string.Empty; 
      } 
      return description; 
     } 
    } 
} 
+4

Веб-сайт больше не доступен –

0

Начало работы - HTML Agility пакет

// From File 
var doc = new HtmlDocument(); 
doc.Load(filePath); 

// From String 
var doc = new HtmlDocument(); 
doc.LoadHtml(html); 

// From Web 
var url = "http://html-agility-pack.net/"; 
var web = new HtmlWeb(); 
var doc = web.Load(url); 
Смежные вопросы