2012-05-05 3 views
0

Я довольно новичок в vb.net, и у меня есть большая проблема с программным обеспечением, которое я создаю для собственного использования.VB.NET download html code tables

1. Предыстория:

У меня есть код в моем программном обеспечении, загружает исходный код веб-страницы в файл .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, как в приведенном выше примере и поиска/предназначаться свой ответ (Браун в данном случае) в своей соседней ячейке и передать ее в переменную String (я всегда буду знать, что я ищу, как «Цвет волос», но я никогда не узнаю заранее ответ на вопрос «Цвет волос», и эта переменная ответа - это то, что я хочу найти).


5. Заключение:

Что VB.N код можно использовать для:

1) таблиц поиска/целевого HTML кода, который содержит такие слова, как "Цвет волос" или «глаза Цвет".

2) Искать/настраивать параметры ответа, независимо от того, что они представляют. (Некоторые вопросы могут иметь большой диапазон возможных ответов, поэтому оператор IF или SELECT CASE для прогнозирования/сравнения их прямо сейчас не является опцией)

3) Передайте ответ на строку в моем программном обеспечении.


6.Примечание

Вопрос (Цвет волос), независимо от того, сколько сотен строк содержит полный исходный код, всегда находится на одной строке в строке таблицы (строка 3).

Ответ также всегда находится на одной строке (строка 6) в строке таблицы.

Однако сами строки вопросов не всегда находятся в одном и том же месте таблицы.

+0

Откуда появляется HTML? Вы говорите, что он неравномерен по структуре - ну, это не позволяет дать решение. Данные в HTML ** не ** равномерно структурированы, и вы не можете запросить его единообразно. – Oded

+0

Благодарим за быстрый ответ. Можно ли указать «Цвет волос» в исходном коде, если он действительно был уникальным (для аргументов), а затем на основе этой цели всегда просто прыгать вниз по 3 линиям, чтобы нацелить то, что когда-либо было на этой линии? – Auhn

+0

Вы можете _find_ эту строку в источнике HTML, но нет способа узнать, в какой структуре она будет храниться без изучения источника. В частности, это не даст вам прямого доступа к другим данным. – Oded

ответ

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

Я только что загрузил HTML Agility Pack и добавил его в качестве ссылки на мой проект, код не дает ошибок excep для HtmlDocument, и я получаю следующую ошибку при попытке сборки: ** Ошибка «HtmlDocument» неоднозначен, импортированных из пространств имен или типов «HtmlAgilityPack, System.Windows.Forms». ** – Auhn

+0

О, я не использовал Windows.Forms в своем тестовом проекте. Замените 'Dim document As New HtmlDocument' на' Dim document As New HtmlAgilityPack.HtmlDocument' –

+0

Приношу свои извинения за то, что не упоминал об этом в своем Вопросе. Я заменил его тем, что вы упомянули, и он очистил эту ошибку. Но теперь Visual Studio 2010 жалуется на _For Every td As HtmlNode In_ ** document.Descendants ** _ ("td") _ и говорит, что ** «Потомки» не являются членами «HtmlAgilityPack.HtmlDocument» **. – Auhn

0

Это обновленный код, но либо клетка-мишень не мишень или его содержимое не передаются в переменный ответ:

Dim document As New HtmlAgilityPack.HtmlDocument, strAnswer As String 
    document.Load("C:\TEST\downloaded.html") 
    For Each td As HtmlAgilityPack.HtmlNode In document.DocumentNode.Descendants("td") 
     If td.InnerText.IndexOf("Hair Color") <> -1 Then 

      strAnswer = td.NextSibling.InnerText 
      MsgBox(strAnswer) 

      Exit For 
     End If 
    Next 

Я не уверен, что текст «Цвет волос» даже найден в этом запросе. Если я попытаюсь вывести строку td.InnerText.IndexOf("Hair Color") <> -1 Then, я получаю значение 4, и, похоже, я ничего не могу передать в строку strAnswer, она вообще ничего не выводит.

Я делаю что-то совершенно не так?