Как использовать HTML Agility Pack?Как использовать пакет гибкости HTML
Документ XHTML недействителен. Вот почему я хотел его использовать. Как использовать его в своем проекте? Мой проект находится на C#.
Как использовать HTML Agility Pack?Как использовать пакет гибкости HTML
Документ XHTML недействителен. Вот почему я хотел его использовать. Как использовать его в своем проекте? Мой проект находится на C#.
Download и постройте решение HTMLAgilityPack.
В приложении, добавьте ссылку на 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, который имеет полную ссылку для каждого из объектов. Обычно это находится в базовой папке решения.
Также обратите внимание, что Load принимает параметр Stream, что удобно во многих ситуациях. Я использовал его для потока HTTP (WebResponse.GetResponseStream). Другим хорошим способом, который следует знать, является HtmlEntity.DeEntitize (часть пакета Agility Pack). Это необходимо для обработки объектов вручную в некоторых случаях. –
примечание: в последней бета-версии Html Agility Pack (1.4.0 Beta 2 выпущен 3 октября 2009) файл справки был перенесен в отдельную загрузку из-за зависимостей от Sandcastle, DocProject и SDK Visual Studio 2008. – rtpHarry
'SelectSingleNode()' похоже, был удален некоторое время назад –
Я не знаю, поможет ли это вам, но я написал несколько статей, в которых представлены основы.
Следующая статья на 95%, я просто должен писать объяснения последних нескольких частей кода Я написал. Если вас это интересует, я постараюсь запомнить его здесь, когда опубликую его.
Наконец закончил эту статью два года спустя :) [Простой способ обнаружение RSS и Atom-каналов на сайтах с помощью HtmlAgilityPack] (http://runtingsproper.blogspot.co.uk/2012/07/a-straightforward-method-to-detecting.html) – rtpHarry
Недавно в _Code Project_ было выпущено очень хорошая статья HTMLAgilityPack. Вы можете прочитать это [здесь] (http://www.codeproject.com/Articles/691119/Html-Agility-Pack-Massive-information-extraction-f) –
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);
}
Полностью верно.Он полностью зависит от стандарта XPath. Сначала нужно изучить этот стандарт, и после этого все будет легко. –
Ссылка, предоставленная Вами, больше не предлагается. Вероятно, это новый: http://www.w3schools.com/xsl/xpath_syntax.asp – Piotrek
также я не вижу никакой функции SelectNodes() в объекте DocumentNode. Это переименовано? – Piotrek
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";
}
}
Главная 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;
}
}
}
Веб-сайт больше не доступен –
Начало работы - 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);
Этот вопрос был очень полезным для меня. – BigJoe714
Примечание: с помощью Visual Studio, которая обрабатывает NuGet, вы можете щелкнуть правой кнопкой мыши «Ссылки» и выбрать «Управление пакетами NuGet ...», найти «HtmlAgilityPack» и нажать «Установить». Затем перейдите в игру с кодом с помощью инструкции/Import. – patridge
Что касается вышеприведенного комментария от @patridge: я обнаружил, что мне нужно удалить, а затем снова добавить ссылку на HtmlAgilityPack при первом получении проекта из svn через ankhsvn. –