从网络浏览器控件中抓取时,我可以使用以下内容:
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
答案 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
元素。