Como uso o HTML Agility Pack ?
Meu documento XHTML não é totalmente válido. É por isso que eu queria usá-lo. Como eu o uso no meu projeto? Meu projeto está em c #.
var body = CQ.CreateFromFile(filePath)["body"]
.
Como uso o HTML Agility Pack ?
Meu documento XHTML não é totalmente válido. É por isso que eu queria usá-lo. Como eu o uso no meu projeto? Meu projeto está em c #.
var body = CQ.CreateFromFile(filePath)["body"]
.
Respostas:
Primeiro, instale o pacote de nuget HTMLAgilityPack no seu projeto.
Então, como um exemplo:
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
}
}
}
(Nota: este código é apenas um exemplo e não necessariamente a melhor / única abordagem. Não o use cegamente em seu próprio aplicativo.)
O HtmlDocument.Load()
método também aceita um fluxo que é muito útil na integração com outras classes orientadas a fluxo na estrutura .NET. While HtmlEntity.DeEntitize()
é outro método útil para processar corretamente entidades html. (obrigado Matthew)
HtmlDocument
e HtmlNode
são as classes que você mais usará. Semelhante a um analisador XML, ele fornece os métodos selectSingleNode e selectNodes que aceitam expressões XPath.
Preste atenção às HtmlDocument.Option??????
propriedades booleanas. Eles controlam como os métodos Load
e LoadXML
irão processar seu HTML / XHTML.
Há também um arquivo de ajuda compilado chamado HtmlAgilityPack.chm que possui uma referência completa para cada um dos objetos. Normalmente, isso está na pasta base da solução.
SelectSingleNode()
parece ter sido removido há um tempo atrás
Não sei se isso ajudará você, mas escrevi alguns artigos que apresentam o básico.
O próximo artigo está 95% completo, basta escrever explicações das últimas partes do código que escrevi. Se você estiver interessado, tentarei me lembrar de postar aqui quando publicá-lo.
O HtmlAgilityPack usa a sintaxe XPath e, embora muitos argumentem que está mal documentado, não tive problemas em usá-lo com a ajuda desta documentação do XPath: https://www.w3schools.com/xml/xpath_syntax.asp
Para analisar
<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>
Eu fiz isso:
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
padrão. Deve-se primeiro aprender esse padrão e tudo será fácil depois disso.
O principal código relacionado ao HTMLAgilityPack é o seguinte
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;
}
}
}
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";
}
}
tente isso
string htmlBody = ParseHmlBody(dtViewDetails.Rows[0]["Body"].ToString());
private string ParseHmlBody(string html)
{
string body = string.Empty;
try
{
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
var htmlBody = htmlDoc.DocumentNode.SelectSingleNode("//body");
body = htmlBody.OuterHtml;
}
catch (Exception ex)
{
dalPendingOrders.LogMessage("Error in ParseHmlBody" + ex.Message);
}
return body;
}