1

私は vb.net を初めて使用し、自分で使用するために作成しているソフトウェアに大きな問題があります。

1. 背景:

私のソフトウェアには、Web ページのソース コードを .txt ファイルにダウンロードし、探している情報を除外するコードがあります。通常の HTML コードの場合、これは正常に機能します。


2. 問題:

問題は、HTML コード内の特定のパラメーターがあいまいすぎてターゲットにできない場合です。


3. 例:

この種の一意の HTML コードをダウンロードして、変数 (この場合は Brown) をソフトウェアの Strings に渡すことができます。これは、コードの同じ行にあるため、一意になります。

<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>

ご覧のとおり、"Hair Color:" は "Eye Color" や "Height" などの任意の変数にすることができ、"Brown" はその質問に対する任意の回答にすることができます。これらのテーブル、行、またはセルには、1 行で記述されている場合のように、これらのコード行を特にターゲットにするのに十分な一意のコードがありません。


4. 欲しいもの:

上記の例のように、HTML コード テーブルで「髪の色」を検索してターゲットにし、その答え (この場合はブラウン) を隣接するセルで検索/ターゲットにして、それを文字列変数に渡すことができるようにします (私は常に、私が「髪の色」のようなものを探していますが、髪の色の質問に対する答えを事前に知ることはできず、その答えの変数が私が見つけたいものです)。


5。結論:

どの VB.NET コードを使用して次のことができますか。

1) 「髪の色」や「目の色」などの単語を含む HTML コード テーブルを検索/対象にします。

2) 回答変数が何であるかに関係なく、それらの回答変数を検索/ターゲットに設定します。(一部の質問には可能な回答の範囲が広い場合があるため、今すぐ予測/比較するための IF または SELECT CASE ステートメントはオプションではありません)

3) 私のソフトウェアの文字列に答えを渡します。


6. 注意事項

質問 (髪の色) は、完全なソース コードが何百行にも及ぶ場合でも、常に表の行 (3 行目) 内の同じ行にあります。

答えも常に表の行の同じ行 (6 行目) にあります。

ただし、質問行自体が常にテーブルの同じ場所にあるとは限りません。

4

1 に答える 1

1

おそらく、 HTML agility packを利用したいと思うでしょう。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 に答える