Visual Basic Читать HTML для добавления в список с помощью Loop - PullRequest
0 голосов
/ 30 апреля 2018

Я создаю программу, которая будет извлекать данные из HTML-кода этого сайта. Этот веб-сайт обновляет свой список каждый месяц и иногда содержит различные элементы. На данный момент я могу выбрать 3 различных значения: Шлем, Липкая граната и C4

.

Однако, когда я пытаюсь получить значение бронированного жилета, я получаю еще один шлем. Вот мой исходный код

Imports System.IO
Imports System.Net
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim pos1 As Long, pos2 As Long, newitem As String, findstring As String
        Dim request As WebRequest = WebRequest.Create("http://cosmic-octane-202719.appspot.com/")
        Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
        Dim datastream As Stream = response.GetResponseStream
        Dim reader As New StreamReader(datastream)
        Dim strData As String = reader.ReadToEnd

        'Keep getting 7 Helmets
        For currentitem As Integer = 1 To 7
            findstring = "<li><strong"
            pos1 = InStr(strData, findstring)
            pos1 = InStr(pos1 + 1, strData, ">", vbTextCompare)
            pos2 = InStr(pos1 + 1, strData, "</strong></li>", vbTextCompare)

            newitem = strData.Substring(pos1 + findstring.Length - 3, pos2 - pos1 - findstring.Length + 2)
            ListBox1.Items.Add(newitem)
        Next

        'Sticky Grenade
        findstring = "<li>Lethal: <strong"
        pos1 = InStr(strData, findstring)
        pos1 = InStr(pos1 + 1, strData, ">", vbTextCompare)
        pos2 = InStr(pos1 + 1, strData, "</strong></li>", vbTextCompare)

        newitem = strData.Substring(pos1 + findstring.Length - 3, pos2 - pos1 - findstring.Length + 2)
        ListBox1.Items.Add(newitem)

        'C4
        findstring = "<li>Placeable: <strong"
        pos1 = InStr(strData, findstring)
        pos1 = InStr(pos1 + 1, strData, ">", vbTextCompare)
        pos2 = InStr(pos1 + 1, strData, "</strong></li>", vbTextCompare)

        newitem = strData.Substring(pos1 + findstring.Length - 3, pos2 - pos1 - findstring.Length + 2)
        ListBox1.Items.Add(newitem)
    End Sub
End Class

Фрагмент HTML-кода

<ul class="disc">
  <li><strong>Helmet</strong></li>
  <li><strong>Armored Vest</strong></li>
  <li><strong>Mk. 42</strong> <span class="red">(Reflex + Grip)</span></li>
  <li><strong>Uzi</strong> <span class="red">(Rapid Fire + Extended Clip)</span></li>
  <li><strong>Combat Knife</strong> <span class="red">(Grip)</span></li>
  <li><strong>Fast Reload</strong> <span class="red">(Advanced)</span></li>
  <li><strong>FMJ</strong> <span class="red">(Basic)</span></li>
  <li>Lethal: <strong>Sticky Grenade</strong></li>
  <li>Placeable: <strong>C4</strong></li>
</ul>
Результат: 7 Шлемов

Я думаю, что моя проблема в том, что программа просто находит строку Шлема и не переходит к следующей строке. Как сделать цикл, который будет искать <li><strong> в каждой строке и добавлять текст, который идет после <li><strong> и до </strong> в список. Например

<li><strong>Helmet</strong></li> would put Helmet into listbox1.
<li><strong>Armored Vest</strong></li> would put Armored Vest into listbox1.
<li><strong>Mk. 42</strong> <span class="red">(Reflex + Grip)</span></li> would put Mk. 42 into listbox1

Кроме этого, я застрял.

1 Ответ

0 голосов
/ 02 мая 2018

Я решил эту проблему с помощью регулярных выражений.

Dim items As MatchCollection = Regex.Matches(strData, "(?<=<li><strong>).*(?=<\/strong)")
For Each match As Match In items
    For Each item As Capture In match.Captures
        ListBox1.Items.Add(item.Value)
    Next
Next

И полный код

Imports System.IO
Imports System.Net
Imports System.Text.RegularExpressions
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim pos1 As Long, pos2 As Long, newitem As String, findstring As String
        Dim request As WebRequest = WebRequest.Create("http://cosmic-octane-202719.appspot.com/")
        Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
        Dim datastream As Stream = response.GetResponseStream
        Dim reader As New StreamReader(datastream)
        Dim strData As String = reader.ReadToEnd
        Dim items As MatchCollection = Regex.Matches(strData, "(?<=<li><strong>).*(?=<\/strong)")
        For Each match As Match In items
            For Each item As Capture In match.Captures
                ListBox1.Items.Add(item.Value)
            Next
        Next
        findstring = "<li>Lethal: <strong"
        pos1 = InStr(strData, findstring)
        pos1 = InStr(pos1 + 1, strData, ">", vbTextCompare)
        pos2 = InStr(pos1 + 1, strData, "</strong></li>", vbTextCompare)
        ListBox1.Items.Add(strData.Substring(pos1 + findstring.Length - 3, pos2 - pos1 - findstring.Length + 2))
        findstring = "<li>Placeable: <strong"
        pos1 = InStr(strData, findstring)
        pos1 = InStr(pos1 + 1, strData, ">", vbTextCompare)
        pos2 = InStr(pos1 + 1, strData, "</strong></li>", vbTextCompare)
        ListBox1.Items.Add(strData.Substring(pos1 + findstring.Length - 3, pos2 - pos1 - findstring.Length + 2))
    End Sub
End Class

Результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...