每行的Vb.net HTMLAgilityPack循环

时间:2015-07-09 11:12:20

标签: vb.net xpath web-scraping html-agility-pack

从网络浏览器控件中抓取时,我可以使用以下内容:

For Each element As HtmlElement In Me.Bookie.Document.GetElementsByTagName("tr")
    If element.GetAttribute("className") = "name" Then
        'do whatever here
    End If
Next

哪种方法正常。

它为每个TR循环,如果它找到“name”类,它就会完成我需要的东西。

尝试使用套接字和HTMLAgilityPack来解决这个问题。我不能简单地使用:

SelectNodes("//tr[@class='name']")

因为敏捷包正在改变格式并删除我的换行符,因此无法进行解析。数据在那里并且它读取它但是HTMLAgilityPack有时会对浏览器控件做一些不同的事情。

所以我需要为每个tr循环并检查每个tr是否存在其他类。它们并不总是存在,我需要知道它们何时不再这样做只是做一个SelectNodes(“// tr [@ class ='otherclass']”)是不够的。我需要知道TR是否有它。

所以如果它在那个tr中找到一个类名为“otherclass”的话,我希望它为每个tr和proc循环。

我认为这是可能的,但我不确定语法是什么样的。

我尝试过各种变体:

For Each node As HtmlNode In SmarkDocument.DocumentNode.SelectNodes("//tr")
    For Each SecondNode As HtmlNode In node.SelectNodes("//a[@class='otherclass']")
        'do whatever
    Next
Next

嵌套循环我尝试使用第一个// tr循环中的node.selectnodes,但它只是循环遍历所有HTML。所以我假设它在第二个循环上的语法问题是导致它查看所有HTML并且基本上忽略第一个循环或者在第二个循环中使用xpath的东西。

我知道'a'标签存在差异,但浏览器在xpath时不需要它。

我假设(并且非常希望)我可以做的事情是:

For Each node As HtmlNode In SmarkDocument.DocumentNode.SelectNodes("//tr")
    If node.Element.Contains("otherclass") Then
        'proc for each name
    End If
Next

1 个答案:

答案 0 :(得分:0)

如果您将For Each SecondNode As HtmlNode In node.SelectNodes("//a[@class='otherclass']")更改为For Each SecondNode As HtmlNode In node.SelectNodes(".//a[@class='otherclass']"),那么您的内部For Each会处理后代a元素而非所有a元素。