Gói nhanh nhẹn Html PDF

Đối với bất kỳ dự án nào lấy nội dung từ trang web bằng C# và phân tích nội dung đó thành định dạng có thể sử dụng được, rất có thể bạn sẽ tìm thấy Gói Agility HTML. Gói Agility là tiêu chuẩn để phân tích cú pháp nội dung HTML trong C#, vì gói này có một số phương thức và thuộc tính hoạt động thuận tiện với DOM. Thay vì viết công cụ phân tích cú pháp của riêng bạn, Gói Agility HTML có mọi thứ bạn cần để tìm các phần tử DOM cụ thể, duyệt qua các nút con và nút cha, đồng thời truy xuất văn bản và thuộc tính (e. g. , liên kết HREF) trong các phần tử được chỉ định

Bước đầu tiên là cài đặt Gói Agility HTML sau khi bạn tạo C#. dự án NET. Trong ví dụ này, chúng tôi sử dụng một. ứng dụng web NET Core MVC. Để cài đặt Agility Pack, bạn cần sử dụng NuGet. NuGet có sẵn trong giao diện Visual Studio bằng cách vào Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution. Trong Cửa sổ này, thực hiện tìm kiếm Gói Agility HTML và cài đặt gói đó vào phần phụ thuộc giải pháp của bạn. Sau khi bạn cài đặt nó, bạn sẽ nhận thấy sự phụ thuộc trong giải pháp của mình và bạn sẽ thấy nó được tham chiếu trong các câu lệnh sử dụng của bạn. Nếu bạn không thấy tham chiếu trong câu lệnh sử dụng của mình, bạn phải thêm dòng sau vào mọi tệp mã mà bạn sử dụng Gói Agility

using HtmlAgilityPack;

Kéo HTML từ một trang Web bằng Thư viện C# gốc

Với phần phụ thuộc Gói Agility được cài đặt, giờ đây bạn có thể thực hành phân tích cú pháp HTML. Đối với hướng dẫn này, chúng tôi sẽ sử dụng Hacker News. Đây là một ví dụ điển hình vì đây là một trang động với danh sách các liên kết phổ biến mà người xem có thể đọc được. Chúng tôi sẽ lấy 10 liên kết hàng đầu trên Hacker News, phân tích cú pháp HTML và đặt nó vào một đối tượng JSON

Trước khi cạo một trang, bạn nên hiểu cấu trúc của nó và xem đoạn mã phía sau trang. Điều này có thể được thực hiện trong trình duyệt bằng cách sử dụng tùy chọn “Kiểm tra phần tử”. Chúng tôi đang sử dụng Chrome, nhưng tính năng này có sẵn trong FireFox và Edge. Nhấp chuột phải và kiểm tra phần tử cho liên kết đầu tiên trên Hacker News. Bạn sẽ nhận thấy rằng các liên kết được chứa trong một bảng và mỗi tiêu đề được liệt kê trong một hàng của bảng với các tên lớp cụ thể. Các tên lớp này có thể được sử dụng để kéo nội dung trong mỗi phần tử DOM khi bạn cạo trang

Gói nhanh nhẹn Html PDF
Gói nhanh nhẹn Html PDF


Các phần tử được khoanh tròn trong hình trên hiển thị các lớp có thể được sử dụng để phân tích các phần tử từ phần còn lại của DOM. Lớp tiêu đề chứa các thành phần cho tiêu đề chính hiển thị trên trang và lớp xếp hạng hiển thị thứ hạng của tiêu đề. Các lớp liên kết câu chuyện và điểm số cũng chứa thông tin quan trọng về liên kết mà chúng ta có thể thêm vào đối tượng JSON

Chúng tôi cũng muốn nhắm mục tiêu các thuộc tính phần tử DOM cụ thể có chứa thông tin mà chúng tôi cần. Các phần tử

using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
1 và
using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
2 chứa nội dung mà chúng tôi muốn và Gói Agility có thể lấy chúng từ DOM và hiển thị nội dung

Bây giờ chúng ta đã hiểu cấu trúc DOM của trang, chúng ta có thể viết mã kéo trang chủ cho Hacker News. Trước khi bắt đầu, hãy thêm các câu lệnh sử dụng sau vào mã của bạn

using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;

Với các câu lệnh sử dụng tại chỗ, bạn có thể viết một phương thức nhỏ sẽ tự động kéo bất kỳ trang web nào và tải nó vào một biến có tên là

using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
3. Dưới đây là một ví dụ về việc kéo một trang web trong C# bằng các thư viện gốc

string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}

Bạn có thể kiểm tra để đảm bảo rằng nội dung trang web đã được kéo bằng cách đặt điểm ngắt và sử dụng Trình hiển thị HTML để xem nội dung

Gói nhanh nhẹn Html PDF
Gói nhanh nhẹn Html PDF


Phân tích cú pháp HTML bằng Agility Pack

Với HTML đã được tải vào một biến, giờ đây bạn có thể sử dụng Gói Agility để phân tích cú pháp. Bạn có hai lựa chọn chính

  • Sử dụng XPath và SelectNodes
  • Sử dụng LINQ

LINQ rất hữu ích khi bạn muốn tìm kiếm thông qua các nút để tìm nội dung cụ thể. Tùy chọn XPath dành riêng cho Gói Agility và được hầu hết các nhà phát triển sử dụng để lặp qua một số phần tử. Chúng tôi sẽ sử dụng LINQ để lấy 10 câu chuyện hàng đầu, sau đó XPath để phân tích các phần tử con và nhận các thuộc tính cụ thể cho từng câu chuyện và tải nó vào một đối tượng JSON. Chúng tôi sử dụng đối tượng JSON vì đó là ngôn ngữ chung có thể được sử dụng trên các nền tảng, API và ngôn ngữ lập trình. Hầu hết các hệ thống đều hỗ trợ JSON, vì vậy đây là cách dễ dàng để làm việc với các ứng dụng bên ngoài nếu bạn cần

Chúng tôi sẽ tạo một phương thức mới sẽ phân tích cú pháp HTML. Đây là phương thức mới với truy vấn LINQ để lấy tất cả các mục có tên lớp là “athing” và các phần tử con của chúng

private void ParseHtml(string html)
{
      HtmlDocument htmlDoc = new HtmlDocument();
      htmlDoc.LoadHtml(html);
      var programmerLinks = htmlDoc.DocumentNode.Descendants("tr")
              .Where(node => node.GetAttributeValue("class", "").Contains("athing")).Take(10).ToList();

}

Mã này tải HTML vào đối tượng Gói Agility

using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
4. Sử dụng LINQ, chúng tôi đã kéo tất cả các phần tử ____1_______5 trong đó tên lớp chứa
using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
6. Phương thức
using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
7 yêu cầu truy vấn LINQ chỉ lấy top 10 từ danh sách. LINQ giúp việc kéo một số phần tử cụ thể và tải chúng vào một danh sách chung dễ dàng hơn nhiều

Chúng tôi không muốn tất cả các yếu tố trong mỗi hàng của bảng, vì vậy chúng tôi cần lặp lại từng mục và sử dụng Gói nhanh nhẹn để chỉ lấy tiêu đề câu chuyện, URL, xếp hạng và điểm số. Chúng tôi sẽ thêm chức năng này vào phương thức

using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
8 vì chức năng mới là một phần của quy trình phân tích cú pháp


Đoạn mã sau hiển thị chức năng được thêm vào trong vòng lặp

using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
9

private void ParseHtml(string html)
{
    HtmlDocument htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(html);
    var programmerLinks = htmlDoc.DocumentNode.Descendants("tr")
            .Where(node => node.GetAttributeValue("class", "").Contains("athing")).Take(10).ToList();

    foreach (var link in programmerLinks)
    {
        var rank = link.SelectSingleNode(".//span[@class='rank']").InnerText;
        var storyName = link.SelectSingleNode(".//a[@class='storylink']").InnerText;
        var url = link.SelectSingleNode(".//a[@class='storylink']").GetAttributeValue("href", string.Empty);
        var score  = link.SelectSingleNode("..//span[@class='score']").InnerText;
    }

}

Đoạn mã trên lặp qua tất cả 10 liên kết hàng đầu trên Hacker News và lấy thông tin mà chúng tôi muốn, nhưng nó không làm gì với thông tin. Bây giờ chúng ta cần tạo một đối tượng JSON để chứa thông tin. Khi chúng tôi có một đối tượng JSON, chúng tôi có thể chuyển đối tượng đó tới bất kỳ thứ gì chúng tôi muốn -- một phương thức khác trong mã của chúng tôi, một API trên nền tảng bên ngoài hoặc tới một ứng dụng khác có thể nhập JSON

Cách dễ nhất để tạo một đối tượng JSON là tuần tự hóa nó từ một lớp. Bạn có thể tạo một lớp trong cùng một không gian tên như bạn đã tạo mã của mình trong các ví dụ trước. Chúng ta sẽ tạo một lớp tên là

string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
0để minh họa

Gói nhanh nhẹn Html PDF
Gói nhanh nhẹn Html PDF


Trong ví dụ này, mã chúng ta đang tạo nằm trong không gian tên

string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
1. Không gian tên của bạn có thể khác với không gian tên của chúng tôi, nhưng bạn có thể tìm thấy nó ở đầu tệp của mình trong câu lệnh
string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
2. Tạo lớp
string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
0 trong cùng một tệp mà bạn đang sử dụng cho hướng dẫn này và quay lại phương thức
using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
8 nơi chúng ta sẽ tạo đối tượng

Ghi chú. Để sử dụng ví dụ hướng dẫn này, bạn cần cài đặt phụ thuộc

string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
5 từ NuGet. Bạn có thể cài đặt nó giống như cách bạn đã cài đặt Agility Pack. Có một số thư viện JSON khác để tuần tự hóa và giải tuần tự hóa các đối tượng, nhưng thư viện Newtonsoft là thư viện phổ biến nhất với các lập trình viên C#. Sau khi bạn cài đặt nó, hãy thêm câu lệnh
string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
2 sau vào mã của bạn

using Newtonsoft.Json;

Với lớp

string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
0 đã được tạo, bây giờ chúng ta có thể thêm mã JSON vào phương thức phân tích cú pháp để tạo đối tượng JSON. Hãy xem phương pháp
using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
8 ngay bây giờ

private string ParseHtml(string html)
{
    HtmlDocument htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(html);
    var programmerLinks = htmlDoc.DocumentNode.Descendants("tr")
            .Where(node => node.GetAttributeValue("class", "").Contains("athing")).Take(10).ToList();

    List newsLinks = new List();

    foreach (var link in programmerLinks)
    {
        var rank = link.SelectSingleNode(".//span[@class='rank']").InnerText;
        var storyName = link.SelectSingleNode(".//a[@class='storylink']").InnerText;
        var url = link.SelectSingleNode(".//a[@class='storylink']").GetAttributeValue("href", string.Empty);
        var score  = link.SelectSingleNode("..//span[@class='score']").InnerText;
                HackerNewsItems item = new HackerNewsItems();
                item.rank = rank.ToString();
                item.title = storyName.ToString();
                item.url = url.ToString();
                item.score = score.ToString();
                newsLinks.Add(item);
    }

    string results = JsonConvert.SerializeObject(newsLinks);

    return results;

}

Lưu ý trong đoạn mã trên rằng lớp

string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
0 được điền từ HTML được phân tích cú pháp. Mỗi đối tượng
string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
0 sau đó được thêm vào danh sách chung, danh sách này sẽ chứa tất cả 10 mục. Câu lệnh cuối cùng trước câu lệnh
private void ParseHtml(string html)
{
      HtmlDocument htmlDoc = new HtmlDocument();
      htmlDoc.LoadHtml(html);
      var programmerLinks = htmlDoc.DocumentNode.Descendants("tr")
              .Where(node => node.GetAttributeValue("class", "").Contains("athing")).Take(10).ToList();

}
1 của phương thức là Newtonsoft chuyển danh sách chung thành một đối tượng JSON

Vậy là xong -- bạn đã lấy 10 liên kết tin tức hàng đầu từ Hacker News và tạo một đối tượng JSON. Đây là mã đầy đủ từ đầu đến cuối với đối tượng JSON cuối cùng có trong biến

private void ParseHtml(string html)
{
      HtmlDocument htmlDoc = new HtmlDocument();
      htmlDoc.LoadHtml(html);
      var programmerLinks = htmlDoc.DocumentNode.Descendants("tr")
              .Where(node => node.GetAttributeValue("class", "").Contains("athing")).Take(10).ToList();

}
2

string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;
var linkList = ParseHtml(response);

private static async Task<string> CallUrl(string fullUrl)
{
    HttpClient client = new HttpClient();
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
    client.DefaultRequestHeaders.Accept.Clear();
    var response = client.GetStringAsync(fullUrl);
    return await response;
}

private string ParseHtml(string html)
{
    HtmlDocument htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(html);
    var programmerLinks = htmlDoc.DocumentNode.Descendants("tr")
            .Where(node => node.GetAttributeValue("class", "").Contains("athing")).Take(10).ToList();

    List newsLinks = new List();

    foreach (var link in programmerLinks)
    {
        var rank = link.SelectSingleNode(".//span[@class='rank']").InnerText;
        var storyName = link.SelectSingleNode(".//a[@class='storylink']").InnerText;
        var url = link.SelectSingleNode(".//a[@class='storylink']").GetAttributeValue("href", string.Empty);
        var score  = link.SelectSingleNode("..//span[@class='score']").InnerText;
                HackerNewsItems item = new HackerNewsItems();
                item.rank = rank.ToString();
                item.title = storyName.ToString();
                item.url = url.ToString();
                item.score = score.ToString();
                newsLinks.Add(item);
    }
    string results = JsonConvert.SerializeObject(newsLinks);
    return results;
}

Lưu ý rằng bạn cũng có thể chọn các nút con từ các nút cha với Gói Agility. HTML Agility Pack sẽ duyệt qua hệ thống phân cấp DOM bằng nhiều phương pháp khác nhau nếu bạn muốn kéo từng phần tử bảng xuống cây DOM

Kéo HTML bằng Selenium và Phiên bản trình duyệt Chrome

Trong một số trường hợp, bạn sẽ cần sử dụng Selenium với trình duyệt để lấy HTML từ một trang. Điều này là do một số trang web hoạt động với mã phía máy khách để hiển thị kết quả. Vì mã phía máy khách thực thi sau khi trình duyệt tải HTML và tập lệnh, ví dụ trước đó sẽ không nhận được kết quả mà bạn cần. Để mô phỏng việc tải mã trong trình duyệt, bạn có thể sử dụng thư viện có tên Selenium. Selenium cho phép bạn lấy HTML từ một trang bằng tệp thực thi của trình duyệt và sau đó bạn có thể phân tích cú pháp HTML bằng Gói Agility giống như cách chúng tôi đã làm ở trên

Trước khi bạn có thể phân tích cú pháp trong trình duyệt, bạn cần cài đặt

private void ParseHtml(string html)
{
      HtmlDocument htmlDoc = new HtmlDocument();
      htmlDoc.LoadHtml(html);
      var programmerLinks = htmlDoc.DocumentNode.Descendants("tr")
              .Where(node => node.GetAttributeValue("class", "").Contains("athing")).Take(10).ToList();

}
3 từ NuGet và thêm câu lệnh
string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
2 vào dự án. Sau khi cài đặt Selenium, hãy thêm các câu lệnh
string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
2 sau vào tệp của bạn

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

Ghi chú. Bạn phải cập nhật trình điều khiển Selenium khi cập nhật Chrome. Nếu bạn gặp lỗi “SessionNotCreatedException. Thông điệp. phiên không được tạo. Phiên bản ChromeDriver này chỉ hỗ trợ phiên bản Chrome xx” trong đó “xx” là số phiên bản dành cho Chrome, bạn phải cập nhật thư viện Selenium trong dự án của mình

Chúng tôi sẽ sử dụng các biến tương tự từ ví dụ trước, nhưng thay đổi mã chính để kéo HTML bằng Selenium và tải nó vào một đối tượng

string fullUrl = "https://news.ycombinator.com/";
var options = new ChromeOptions()
{
       BinaryLocation = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
 };

options.AddArguments(new List<string>() { "headless", "disable-gpu" });
var browser = new ChromeDriver(options);
browser.Navigate().GoToUrl(fullUrl);
var linkList = ParseHtml(browser.PageSource);

Lưu ý trong đoạn mã trên rằng cùng một phương thức

using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
8 được sử dụng, nhưng lần này chúng tôi chuyển nguồn trang Selenium làm đối số. Biến
private void ParseHtml(string html)
{
      HtmlDocument htmlDoc = new HtmlDocument();
      htmlDoc.LoadHtml(html);
      var programmerLinks = htmlDoc.DocumentNode.Descendants("tr")
              .Where(node => node.GetAttributeValue("class", "").Contains("athing")).Take(10).ToList();

}
7 trỏ tới tệp thực thi của Chrome nhưng đường dẫn của bạn có thể khác, vì vậy hãy đảm bảo đó là vị trí đường dẫn chính xác trong mã của riêng bạn. Bằng cách sử dụng lại cùng một phương pháp, bạn có thể chuyển đổi giữa tải trực tiếp HTML bằng thư viện C# gốc và tải nội dung phía máy khách và phân tích cú pháp mà không cần viết mã mới cho từng sự kiện

Dưới đây là mã đầy đủ để thực hiện yêu cầu và phân tích cú pháp HTML

using HtmlAgilityPack;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Net;
using System.Text;
0

Mã này vẫn phân tích cú pháp HTML và chuyển đổi nó thành một đối tượng JSON từ lớp

string fullUrl = "https://news.ycombinator.com/";
var response = CallUrl(fullUrl).Result;

private static async Task<string> CallUrl(string fullUrl)
{
       HttpClient client = new HttpClient();
       ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
       client.DefaultRequestHeaders.Accept.Clear();
        var response = client.GetStringAsync(fullUrl);
        return await response;
}
0, nhưng HTML được phân tích cú pháp sau khi tải nó vào một trình duyệt ảo. Trong ví dụ này, chúng tôi đã sử dụng Headless Chrome với Selenium, nhưng Selenium cũng có trình điều khiển cho FireFox không đầu có sẵn từ NuGet

Hiện tại, chúng tôi đã sử dụng LINQ và XPath để chọn các lớp CSS, nhưng những người tạo Gói Agility hứa rằng các bộ chọn CSS sẽ ra mắt

Suy nghĩ cuối cùng

HTML Agility Pack là một công cụ tuyệt vời để quét các trang web, nhưng nó thiếu một số tính năng chính. Ví dụ: chúng tôi cần các thư viện bổ sung (Selenium) để loại bỏ các ứng dụng trang đơn được tạo bằng các khung SPA như React. js, góc cạnh. js hoặc Vue. js

XPath cũng rất quan trọng vì ngôn ngữ truy vấn này linh hoạt hơn nhiều so với bộ chọn CSS. Nhìn chung, đó là một thư viện tuyệt vời để phân tích cú pháp HTML, nhưng bạn vẫn cần các thư viện bổ sung để linh hoạt hơn

Các ví dụ C# của chúng tôi đã sử dụng Agility Pack và Selenium cho các ứng dụng trang đơn, nhưng bài viết tiếp theo của chúng tôi sẽ tập trung vào ScrapySharp. Bạn cũng có thể đọc hướng dẫn của chúng tôi về quét web bằng C#

Gói nhanh nhẹn Html PDF

Jennifer Marsh

Jennifer Marsh là nhà phát triển phần mềm và nhà văn công nghệ cho một số ấn phẩm trong nhiều ngành bao gồm an ninh mạng, lập trình, DevOps và vận hành CNTT

Gói linh hoạt HTML có miễn phí không?

Html Agility Pack (HAP) là trình phân tích cú pháp HTML mã nguồn mở và miễn phí được viết bằng C# để đọc/ghi DOM và hỗ trợ XPATH hoặc XSLT đơn giản. Nó là một. NET cho phép bạn phân tích các tệp HTML "ngoài web".

Làm cách nào để sử dụng gói nhanh nhẹn HTML trong mạng asp?

Ghi chú bên lề. với Visual Studio xử lý NuGet, giờ đây bạn có thể nhấp chuột phải vào "Tài liệu tham khảo" và chọn "Quản lý gói NuGet. ", tìm kiếm "HtmlAgilityPack" và nhấp vào "Cài đặt". Sau đó bắt đầu chơi với mã bằng câu lệnh sử dụng/Nhập

Làm cách nào để chuyển đổi HTML sang PDF trong gấu trúc?

Ví dụ. .
# nhập mô-đun cần thiết
nhập pdfkit
# định cấu hình pdfkit để trỏ đến cài đặt wkhtmltopdf của chúng tôi
cấu hình = pdfkit. cấu hình (wkhtmltopdf = r"C. \\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf. exe")
#chuyển đổi tệp html sang tệp pdf
pdfkit. from_file('mẫu. html', 'đầu ra

Làm cách nào để tải HTML sang PDF Python?

Chuyển đổi HTML/trang web sang PDF .
Bước 1. Tải thư viện pdfkit. $ pip cài đặt pdfkit
Bước 2. Tải xuống wkhtmltopdf. Đối với Ubuntu/Debian. sudo apt-get cài đặt wkhtmltopdf. Cho cửa sổ. (a) Liên kết tải xuống. WKHTMLTOPDF. .
Bước 3. Mã bằng Python để tải xuống. (i) Trang HTML đã lưu. nhập pdfkit