2012-05-05 74 views
0

我很新vb.net,我有一个很大的问题,我正在为我自己创建一个软件。VB.NET下载html代码表

背景:

我有一些代码在我的软件,下载一个网页的源代码转换成txt文件,并过滤掉它寻找信息。对于正常的HTML代码,这工作正常。


2.问题:

问题是,当我不能指定的HTML代码的具体参数,因为他们太含糊。


3例子:

我可以下载这种独特的HTML代码和传递变量(布朗在这种情况下)为字符串在我的软件,因为它是在同一行代码制作其独特之处:

<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变量(我会一直知道我在寻找像“头发颜色”,但我永远不会事先知道头发颜色问题的答案,并且该答案变量是我想要查找的)。


结论:

VB.NET代码,我可以用什么来:包含像 “头发颜色” 或“眼睛的话

1)搜索/目标HTML代码表颜色”。

2)搜索/定位他们的答案变量,不管它们是什么。 (有些问题可以有很长的范围可能的答案,那么IF或SELECT CASE语句来预测/比较他们现在是不是一种选择)

3)答案传递给我的软件的String。


6。注意

无论数百行完整的源代码是什么,问题(头发颜色)总是在表格行(第3行)的同一行上。

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

然而问题行本身并不总是对在同一个地方的表。

+0

HTML从哪里来?你说它在结构上不统一 - 好吧,这使得不可能提供解决方案。 HTML中的数据不是**统一的,你不能以统一的方式查询它。 – Oded

+0

感谢您的快速回复。是否可以在源代码中使用“头发颜色”作为目标,如果它确实是唯一的(出于参数的缘故),然后基于该目标,总是只需跳下3行即可定位该线上的任何内容? – Auhn

+0

您可以在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敏捷性包并将其添加为我的项目,代码不给excep对的HTMLDocument错误的引用,我收到试图建立时,出现以下错误:“的HTMLDocument”不明确**错误,从名称空间或类型'HtmlAgilityPack,System.Windows.Forms'导入。** – Auhn

+0

哦,我没有在我的测试项目中使用Windows.Forms。用'昏暗的文件作为新HtmlAgilityPack.HtmlDocument' –

+0

更换'昏暗的文件作为新HtmlDocument'我的道歉不提的是,在我的问题。我用你提到的替换了它,并清除了那个错误。但现在Visual Studio 2010抱怨_For每个td As HtmlNode In_ ** document.Descendants ** _(“td”)_并表示**'Descendants'不是'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,它似乎并没有产生任何输出。

我做得完全错误的?