HTML Çeviklik Paketini nasıl kullanırım ?
XHTML dokümanım tamamen geçerli değil. Bu yüzden kullanmak istedim. Projemde nasıl kullanırım? Projem C # dilinde.
var body = CQ.CreateFromFile(filePath)["body"]
.
HTML Çeviklik Paketini nasıl kullanırım ?
XHTML dokümanım tamamen geçerli değil. Bu yüzden kullanmak istedim. Projemde nasıl kullanırım? Projem C # dilinde.
var body = CQ.CreateFromFile(filePath)["body"]
.
Yanıtlar:
İlk olarak, yüklemek HTMLAgilityPack projenize Nuget paketi.
Sonra, örnek olarak:
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
}
}
}
(Not: Bu kod yalnızca bir örnektir ve mutlaka en iyi / tek yaklaşım değildir. Kendi uygulamanızda körü körüne kullanmayın.)
HtmlDocument.Load()
Yöntem ayrıca, .NET çerçevesinde diğer akış yönlendirilmiş sınıfları ile entegre çok yararlı olan bir akım kabul eder. Süre HtmlEntity.DeEntitize()
html varlıklarını doğru işlemek için başka bir yararlı yöntemdir. (teşekkürler Matthew)
HtmlDocument
ve HtmlNode
en çok kullanacağınız sınıflardır. XML ayrıştırıcısına benzer şekilde, XPath ifadelerini kabul eden selectSingleNode ve selectNodes yöntemlerini sağlar.
HtmlDocument.Option??????
Boole özelliklerine dikkat edin . Bunlar, Load
ve LoadXML
yöntemlerinin HTML / XHTML'nizi nasıl işleyeceğini denetler .
HtmlAgilityPack.chm adlı nesnelerin her biri için tam bir referansa sahip derlenmiş bir yardım dosyası da vardır. Bu normalde çözümün temel klasöründedir.
SelectSingleNode()
bir süre önce kaldırılmış gibi görünüyor
Bunun size yardımcı olup olmayacağını bilmiyorum, ancak temelleri tanıtan birkaç makale yazdım.
Sonraki makale% 95 tamamlandı, sadece yazdığım kodun son birkaç bölümünün açıklamalarını yazmam gerekiyor. Eğer ilgileniyorsanız o zaman ben yayınlamak burada buraya hatırlamak çalışacağız.
HtmlAgilityPack XPath sözdizimini kullanır ve pek çoğu bunun belgelenmediğini iddia etse de, bu XPath belgelerinin yardımıyla kullanmakta sorun yaşamadım: https://www.w3schools.com/xml/xpath_syntax.asp
Ayrıştırmak için
<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>
Bunu ben yaptım:
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
standarda bağlıdır . Kişi önce bu standardı öğrenmeli ve bundan sonra her şey kolay olacak.
HTMLAgilityPack ile ilgili ana kod aşağıdaki gibidir
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";
}
}
bunu dene
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;
}