1

我对 vb.net 还是很陌生,我为自己使用而创建的软件有一个大问题。

一、背景:

我的软件中有代码,可以将网页的源代码下载到 .txt 文件中并过滤掉它正在寻找的信息。对于普通的 HTML 代码,这可以正常工作。


2.问题:

问题是当我无法定位 HTML 代码中的特定参数时,因为它们太模糊了。


3. 例子:

我可以下载这种独特的 HTML 代码并将变量(在本例中为 Brown)传递给我的软件中的字符串,因为它位于同一行代码中,使其独一无二:

<div class="Performer_DataLabel">Hair Color:</div> Brown</div>

但是我想知道如何搜索一个特定的表格及其行和单元格(如下面的这个显示了 1 行和我感兴趣的 2 个单元格的代码):

1.  <tr>
2.      <td class="paramname">
3.         <b>Hair Color:</b>
4.      </td>
5.      <td class="paramvalue">
6.          Brown&nbsp;
7.      </td>
8.  </tr>

问题是,正如您所看到的,“头发颜色:”可以是任何变量,例如“眼睛颜色”或“身高”,而“棕色”可以是该问题的任何答案。这些表格、行或单元格中没有足够的唯一代码来专门针对这些代码行,就像它们写在一行上一样。


4. 我想要:

为了能够像上面的示例一样在 HTML 代码表中搜索和定位“头发颜色”,并在其相邻单元格中搜索/定位其答案(在本例中为棕色)并将其传递给字符串变量(我将始终知道我'正在寻找“头发颜色”,但我永远不会事先知道头发颜色问题的答案,而答案变量就是我想要找到的)。


五、结论:

我可以使用哪些 VB.NET 代码:

1) 搜索/定位包含“头发颜色”或“眼睛颜色”等词的 HTML 代码表。

2)搜索/定位他们的答案变量,无论它们是什么。(有些问题可能有很多种可能的答案,因此现在不能使用 IF 或 SELECT CASE 语句来预测/比较它们)

3) 将答案传递给我的软件中的字符串。


6.注意

问题(头发颜色),无论完整源代码有多少数百行,始终位于表格行中的同一行(第 3 行)。

答案也总是在表格行的同一行(第 6 行)上。

然而,问题行本身并不总是在表格的同一位置。

4

1 回答 1

1

您可能想使用HTML 敏捷包,它对解析 HTML(甚至不是有效的 HTML)非常有用。您需要下载它并添加到项目的引用中,Imports HtmlAgilityPack在代码文件的开头添加。这是之后解决您的问题的代码:

Imports HtmlAgilityPack
Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim document As New HtmlAgilityPack.HtmlDocument, strAnswer As String
        document.Load("C:\tmp\1.html")
        For Each td As HtmlAgilityPack.HtmlNode In document.DocumentNode.Descendants("td")
            If td.InnerText.IndexOf("Hair Color") <> -1 Then
                strAnswer = next_td(td).InnerText
                MsgBox(strAnswer)
                Exit For
            End If
        Next
    End Sub
    Private Function next_td(td As HtmlNode) As HtmlNode
      Try
        If td.NextSibling.Name = "td" Then
            Return td.NextSibling
        Else
            Return next_td(td.NextSibling)
        End If
       Catch
       Throw New Exception("Last <td> in document reached")
       End Try
    End Function
End Class
于 2012-05-05T17:25:53.057 回答