Vb.net 每行的 HTMLAgilityPack 循环

Vb.net HTMLAgilityPack Loop for Each Row

从网络浏览器控件抓取时,我可以使用类似的东西:

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" class 它会做我需要的。

尝试使用套接字和 HTMLAgilityPack 进行此操作会导致一些问题。我不能简单地使用:

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

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

因此,我需要为每个 tr 循环并检查每个 tr 是否存在其他 classes。他们并不总是在那里,我需要知道他们什么时候不在那里,仅仅做一个 SelectNodes("//tr[@class='otherclass']") 是不够的。我想知道TR有没有

所以我希望它在每个 tr 和 proc 中循环,如果它在那个 tr 中找到一个 classname "otherclass"。

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

我试过变体:

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

如果您将 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 元素。