ฉันจะใช้HTML Agility Pack ได้อย่างไร
เอกสาร XHTML ของฉันไม่ถูกต้อง นั่นเป็นเหตุผลที่ฉันต้องการใช้มัน ฉันจะใช้มันในโครงการของฉันได้อย่างไร โครงการของฉันอยู่ใน C #
var body = CQ.CreateFromFile(filePath)["body"]
เป็น
ฉันจะใช้HTML Agility Pack ได้อย่างไร
เอกสาร XHTML ของฉันไม่ถูกต้อง นั่นเป็นเหตุผลที่ฉันต้องการใช้มัน ฉันจะใช้มันในโครงการของฉันได้อย่างไร โครงการของฉันอยู่ใน C #
var body = CQ.CreateFromFile(filePath)["body"]
เป็น
คำตอบ:
ครั้งแรกที่ติดตั้งHTMLAgilityPackแพคเกจ nuget ในโครงการของคุณ
จากนั้นเป็นตัวอย่าง:
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
}
}
}
(หมายเหตุ: รหัสนี้เป็นตัวอย่างเท่านั้นและไม่จำเป็นต้องเป็นวิธีการที่ดีที่สุด / อย่างเดียวอย่าใช้อย่างสุ่มสี่สุ่มห้าในแอปพลิเคชันของคุณเอง)
HtmlDocument.Load()
วิธียังยอมรับกระแสซึ่งเป็นประโยชน์อย่างมากในการบูรณาการกับกระแสเชิงชั้นเรียนอื่น ๆ ในกรอบ NET ที่ ในขณะที่HtmlEntity.DeEntitize()
เป็นอีกวิธีที่มีประโยชน์สำหรับการประมวลผลหน่วยงาน HTML ได้อย่างถูกต้อง (ขอบคุณ Matthew)
HtmlDocument
และHtmlNode
เป็นชั้นเรียนที่คุณจะใช้มากที่สุด คล้ายกับตัวแยกวิเคราะห์ XML ซึ่งจัดเตรียมเมธอด selectSingleNode และ selectNodes ที่ยอมรับนิพจน์ XPath
ให้ความสนใจกับHtmlDocument.Option??????
คุณสมบัติบูลีน ควบคุมวิธีการLoad
และLoadXML
วิธีการเหล่านี้ในการประมวลผล HTML / XHTML ของคุณ
นอกจากนี้ยังมีไฟล์ช่วยเหลือที่คอมไพล์ชื่อ HtmlAgilityPack.chm ซึ่งมีการอ้างอิงที่สมบูรณ์สำหรับแต่ละออบเจ็กต์ โดยปกติจะอยู่ในโฟลเดอร์ฐานของโซลูชัน
SelectSingleNode()
ดูเหมือนว่าจะถูกลบออกในขณะที่ผ่านมา
ฉันไม่รู้ว่าสิ่งนี้จะช่วยคุณได้หรือไม่ แต่ฉันได้เขียนบทความสองสามฉบับที่แนะนำพื้นฐาน
บทความถัดไปเสร็จสมบูรณ์ 95% ฉันแค่ต้องเขียนคำอธิบายของส่วนสุดท้ายของรหัสที่ฉันเขียน หากคุณสนใจฉันจะพยายามจำโพสต์ที่นี่เมื่อฉันเผยแพร่
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
มาตรฐานอย่างเต็มที่ หนึ่งควรเรียนรู้ว่ามาตรฐานและทุกอย่างจะง่ายหลังจากนั้น
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;
}
}
}
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";
}
}
เริ่มต้นใช้งาน - ชุดความคล่องตัวของ HTML
// 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);
ลองนี้
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;
}