Get data từ table HTML website trong winform

Chào mọi người em có một vấn đề cần mọi người giúp đỡ, e có 1 đề bài yêu cầu tạo một form để lấy dữ liệu từ đường link của 1 trang web cụ thể là muốn lấy dữ liệu dạng bảng trong trang web để hiện lên datagridview nhưng gặp lỗi như hình, có vẻ như là trang web em đang muốn lấy dữ liệu không thẻ table nên nó bảo null không tìm thấy, nó được hiển thị trong thẻ div, nếu như đang gặp trường hợp vậy có cách nào để nó có thể lấy dữ liệu dạng bảng về datagridview không dù cho đó không phải thẻ table , xin lỗi mọi người lần đầu đăng bài có thể câu từ hơi lủng củng dài dòng khó hiểu

đây là code của em :

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void btnGetData_Click(object sender, EventArgs e)
    {
        string url = txtURL.Text;

        if (!string.IsNullOrEmpty(url))
        {
            try
            {
                using (WebClient client = new WebClient())
                {
                    string htmlContent = client.DownloadString(url);

                    
                    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
                    doc.LoadHtml(htmlContent);

                    
                    HtmlNode tableNode = doc.DocumentNode.SelectSingleNode("//table");

                   
                    dataGridView1.Rows.Clear();

                
                    foreach (HtmlNode row in tableNode.SelectNodes("tr"))
                    {
                        DataGridViewRow dataGridViewRow = new DataGridViewRow();
                        foreach (HtmlNode cell in row.SelectNodes("th|td"))
                        {
                            dataGridViewRow.Cells.Add(new DataGridViewTextBoxCell { Value = cell.InnerText });
                        }
                        dataGridView1.Rows.Add(dataGridViewRow);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi: " + ex.Message);
            }
        }
        else
        {
            MessageBox.Show("Vui lòng nhập URL trang web.");
        }
    }

Ủa, hỏi gì kỳ vậy bạn. Cái này là kiến thức lập trình chung chứ không phải ngôn ngữ nào đâu nhé.

Nếu dữ liệu dạng tabular mà không dùng thẻ table mà là thẻ DIV hay gì đó khác thì bạn phải đọc cái đoạn HTML với thẻ DIV và mớ thẻ con của nó để hiểu được dòng và cột, rồi thì đọc cái đoạn đó vào xử lý chứ? Ví dụ:

<div class="đây-là-bảng">
    <div class="dòng-đầu-của-bảng"><!-- flex box nghen -->
         <div class="cột">Năm sinh</div>
         <div class="cột">Họ tên</div>
    </div>
    <div class="thân-của-bảng">
         <div class="dòng">
              <div class="cột">2000</div>
              <div class="cột">Chu Như Nhậu</div>
         </div>
        <div class="dòng">
              <div class="cột">1999</div>
              <div class="cột">Địch Văn Dạy</div>
         </div>
         <div class="dòng">
              <div class="cột">2003</div>
              <div class="cột">Bùm Thị Học</div>
         </div>
    </div>
</div>

Thì bạn sẽ thấy rằng dòng cột “hiện lên” rất rõ ràng. Trường hợp của bạn đang thế nào thì bạn phải lấy nó ra viết lên bảng và phân tích nếu đọc trên máy tính thấy tối hù. Còn bạn không biết HTML đủ để hiểu thẻ DIV nó như thế nào thì bỏ ra vài giờ để học HTML để hiểu được. Nếu đọc về HTML đoạn nói về các thẻ table, div,… rồi mà không biết nó làm gì thì thua, bạn cần phải bổ sung thêm kiến thúc vì bạn đang chưa biết input là gì thì viết code xử lý kiểu gì?

Rồi từ HTML kia bạn tìm hiểu về XPath hoặc CSS selectors để xử lý mã HTML, và “bóc tách” ra được nội dung cần lấy. Còn nếu bạn thấy tự tin không cần XPath, CSS selectors luôn thì bạn có thể viết một hàm để parser mớ HTML mà bạn có được.

Cuối cùng: bạn phải tìm được mẫu chung của HTML mà bạn đọc vào hoặc có vài mẫu gì đó, còn không có gì để nhận diện thì nên làm thủ công thay vì máy, hoặc nghiên cứu về trí tuệ nhân tạo để nó phát hiện ra đoạn cần trích xuất giúp bạn.

Data bạn có được ở dạng ma trận thì bạn nhét vào data grid gì đó dễ như ăn ớt?

2 Likes

Vâng ạ, e đã bỏ qua bước thẻ table có trong thẻ DIV, cảm ơn bác đã thông tin và hướng giải quyết em sẽ sàng lọc lại ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?