【问题标题】:How can I parse this table to datagridview?如何将此表解析为 datagridview?
【发布时间】:2019-11-28 14:03:10
【问题描述】:

我找到了一个将 web 表解析为 csv 并将数据写入计算机中的文本文件的代码示例,但我想将其解析为我的 datagridview,而不是计算机位置。

我不明白为什么我不能像上面所说的那样添加这个问题:看起来 就像您的帖子主要是代码一样;请添加更多细节;这不是好的Stuckoverflow!我不需要太多说话的 ricky 我只是有几个单词和代码示例这就是这个网站应该是关于而不是弹出警告'写更多人'哈哈。

这里是html网站:

            <table id="example" class="display" style="width:100%">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Position</th>
                        <th>Office</th>
                        <th>Age</th>
                        <th>Start date</th>
                        <th>Salary</th>
                    </tr>
                </thead>
                <tbody>

                    <tr>
                        <td>Jennifer Chang</td>
                        <td>Regional Director</td>
                        <td>Singapore</td>
                        <td>28</td>
                        <td>2010/11/14</td>
                        <td>$357,650</td>
                    </tr>
                    <tr>
                        <td>Brenden Wagner</td>
                        <td>Software Engineer</td>
                        <td>San Francisco</td>
                        <td>28</td>
                        <td>2011/06/07</td>
                        <td>$206,850</td>
                    </tr>       
                    <tr>
                        <td>Sakura Yamamoto</td>
                        <td>Support Engineer</td>
                        <td>Tokyo</td>
                        <td>37</td>
                        <td>2009/08/19</td>
                        <td>$139,575</td>
                    </tr>

                    <tr>
                        <td>Donna Snider</td>
                        <td>Customer Support</td>
                        <td>New York</td>
                        <td>27</td>
                        <td>2011/01/25</td>
                        <td>$112,000</td>
                    </tr>
                </tbody>
                <tfoot>
                    <tr>
                        <th>Name</th>
                        <th>Position</th>
                        <th>Office</th>
                        <th>Age</th>
                        <th>Start date</th>
                        <th>Salary</th>
                    </tr>
                </tfoot>
            </table>        

这是需要修改的代码:

Imports System.IO
Imports System.Net
Imports HtmlAgilityPack

Public Class Class1

    Public Function Demo1() As DataTable
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
        Dim Document As New HtmlAgilityPack.HtmlDocument
        Dim myHttpWebRequest = CType(WebRequest.Create("https://website.com/table.html"), HttpWebRequest)
        myHttpWebRequest.UserAgent = "Mozilla/5.0 (compat ble; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"
        Dim streamRead = New StreamReader(CType(myHttpWebRequest.GetResponse(), HttpWebResponse).GetResponseStream)
        Dim res As HttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse)
        Document.Load(res.GetResponseStream, True)

        Dim table As HtmlAgilityPack.HtmlNode = Document.DocumentNode.SelectSingleNode("//table[@id='example']")

        Dim dt As New DataTable()

        If table IsNot Nothing Then
            Dim rows = table.SelectNodes("tr")
            If rows Is Nothing AndAlso table.SelectSingleNode("tbody") IsNot Nothing Then
                rows = table.SelectSingleNode("tbody").SelectNodes("tr")
            End If

            For row As Integer = 0 To rows.Count - 1
                'if row = then these are headers
                If row = 0 Then
                    Dim cols = rows(row).SelectNodes("th")
                    dt.Columns.Add(New DataColumn(cols(0).InnerText.ToString()))
                    dt.Columns.Add(New DataColumn(cols(1).InnerText.ToString()))
                    dt.Columns.Add(New DataColumn(cols(2).InnerText.ToString()))
                    dt.Columns.Add(New DataColumn(cols(3).InnerText.ToString()))
                    dt.Columns.Add(New DataColumn(cols(4).InnerText.ToString()))
                    dt.Columns.Add(New DataColumn(cols(5).InnerText.ToString()))
                Else
                    Dim cols = rows(row).SelectNodes("td")
                    Dim dr As DataRow = dt.NewRow()
                    dr(0) = cols(0).InnerText.ToString()
                    dr(1) = cols(1).InnerText.ToString()
                    dr(2) = cols(2).InnerText.ToString()
                    dr(3) = cols(3).InnerText.ToString()
                    dr(4) = cols(4).InnerText.ToString()
                    dr(5) = cols(5).InnerText.ToString()
                    dt.Rows.Add(dr)
                End If
            Next

        End If
        Return dt

    End Function

End Class

感谢您的帮助。

【问题讨论】:

  • 警告您的帖子主要是代码的原因是您需要解释您的问题。恐怕只是发布代码并要求某人修复它不是这里的主题。

标签: vb.net parsing datagridview html-agility-pack


【解决方案1】:

首先选择您需要的最接近的东西,可以是表格,也可以是更接近数据的东西。由于我看不到确切的 html,因此我以您提供的 html 为例(其中一种方法)。

我基本上做的是导航到数据行,然后循环遍历它们,而对于给定行的每一列,我抓取数据,然后将其放入 DGV。

我事先在设计器中制作了 DGV 标头。 (您可以通过编程方式完成,但如果它是一个固定/单一网站,那么您可以手动完成)

Imports HtmlAgilityPack

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim WebDoc As New HtmlDocument
        WebDoc.LoadHtml(TextBox1.Text) 'Your url appears to be blank so icopied the html

        Dim RowNodes As HtmlNodeCollection = WebDoc.DocumentNode.SelectNodes("//tbody/tr")
        For Each _HTMLNode As HtmlNode In RowNodes
            'There's multple ways to do the column thing
            Dim ColumnCollection As String = Nothing
            For Each _SubNode As HtmlNode In _HTMLNode.SelectNodes("./td") 'Columns there apepar to be some #text nodes we dont need, probably cuzz i used textbox
                ColumnCollection &= "✄" & _SubNode.InnerText 'some non standard symbol used for spliting string later
            Next
            ColumnCollection = ColumnCollection.Substring(1) 'remove first symbol
            DataGridView1.Rows.Add(ColumnCollection.Split({"✄"}, StringSplitOptions.RemoveEmptyEntries))
        Next
    End Sub
End Class

请记住,所有数据都被视为字符串。如果需要,您需要额外的代码来将其设置为正确的数据类型。

【讨论】:

  • 好酷我现在去试试;请再问一个问题:为什么您说“用于将其设置为正确数据类型的附加代码”如果可行,为什么我们确实需要它?
  • 好的,我测试了,但我一遍又一遍地遇到相同的错误,就像之前的项目“System.NullReferenceException: bject reference not set to an instance of an object.”一样。
  • 你修好了吗?我想那是因为你没有文本框。您必须调整代码并放置响应流而不是文本框。
  • 我当然删除了文本框并添加了我的网址,但它不起作用
  • “不起作用”描述性不够,您遇到了什么样的错误以及在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多