鉴于这个问题时不时被问到,我会看看是否能一劳永逸地解决这个问题。以下是关于如何查找没有ID的元素的更广泛的指南:
-基础知识-
您可以使用许多内置属性和方法来标识元素。最常见的包括:
这些方法和属性都可以以不同的方式用于标识元素,如下例所示。
注:
我省略了
HtmlElement.OuterText
因为它的行为有点奇怪,我不能百分之百确定它到底做了什么。
-查找无ID元素的示例-
下面是一组示例,说明如何使用前面提到的方法和属性来查找要查找的元素。
按类查找元素(-名称)
根据其查找和元素
class
属性,您必须迭代所有元素并检查
GetAttribute("className")
在每个上。如果事先知道元素类型(标记名),可以通过首先获取所有元素的集合来缩小搜索范围
那种类型的
使用
HtmlDocument.GetElementsByTagName()
而不是
HtmlDocument.All
.
HTML代码:
<div class="header">
<div id="title" class="centerHelper">
<img id="logo" src="img/logo.png"/>
</div>
<p class="headerContent">
Hello World!
</p>
</div>
要定位的元素:
<p class="headerContent">
VB。网络代码:
'Iterate all elements.
For Each Element As HtmlElement In WebBrowser1.Document.All
If Element.GetAttribute("className") = "headerContent" Then
'Found. Do something with 'Element'...
Exit For 'Stop looping.
End If
Next
基于属性查找元素,位于另一个元素内(ID为)
为了根据子元素的一个属性查找子元素,其中子元素位于父元素(具有ID)内,您只需通过其ID获取父元素,然后迭代其所有子元素。
HTML代码:
<select id="items" class="itemsList">
<option value="2">Apple</option>
<option value="3">Orange</option>
<option value="5">Banana</option>
</select>
要定位的元素:
<option value="5">Banana</option>
VB。网络代码:
'Iterate all children of the element with ID "items".
For Each Element As HtmlElement In WebBrowser1.Document.GetElementByID("items").Children
If Element.getAttribute("value") = "5" Then
'Found. Do something with 'Element'...
Exit For 'Stop looping.
End If
Next
基于属性查找元素,位于另一个元素内部(无ID)
根据子元素的一个属性查找子元素,其中子元素位于父元素内部(即
不
有一个ID)您首先必须创建一个外部循环来查找
父母亲
要素然后,找到后,可以开始迭代子级。
HTML代码:
<select class="itemsList">
<option value="2">Apple</option>
<option value="3">Orange</option>
<option value="5">Banana</option>
</select>
要定位的元素:
<选项值=“5”>香蕉</选项(>);
VB。网络代码:
'Variable keeping track of whether we found the element we're looking for or not.
Dim ElementFound As Boolean = False
'Outer loop, looking for the parent object (<select class="itemsList">).
For Each Element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("select") 'Iterate all <select> tags. You can use Document.All here as well.
If Element.getAttribute("className") = "itemsList" Then
'Parent found.
'Inner loop, looking for the child element we want (<option value="5">Banana</option>).
For Each OptionElement As HtmlElement In Element.GetElementsByTagName("option")
If OptionElement.GetAttribute("value") = "5" Then
'Found. Do something with 'OptionElement'...
ElementFound = True
Exit For 'Exit the inner loop.
End If
Next
'Exit the outer loop if we found the element we're looking for.
If ElementFound Then Exit For
End If
Next
根据元素的
InnerText
在某些情况下,您要定位的元素没有任何属性,或者与站点上的许多其他元素过于相似。在这种情况下,如果其内容始终相同,则可以通过
标记模板
或
InnerHtml
属性。
HTML代码:
<h1>Important information</h1>
<p>Please read this information through <b>carefully</b> before continuing.</p>
<h2>Copyrighted material<h2>
<p>All material (text, images, video, etc.) on this site are <b>copyrighted</b> to COMPANY NAME.</p>
要定位的元素:
<h2>Copyrighted material<h2>
VB。网络代码:
For Each Element As HtmlElement In WebBrowser.Document.All
If Element.InnerText = "Copyrighted material" Then
'Found. Do something with 'Element'...
Exit For 'Stop looping.
End If
Next
根据元素的
InnerHtml
根据元素的
InnerHtml
与根据其
标记模板
除此之外,您现在检查的字符串还包括HTML代码。
HTML代码:
<h1>重要信息</h1>
<p>请通过阅读此信息(<b>小心</b>继续之前</p>
<h2>受版权保护的材料<h2>
<p>本网站上的所有材料(文本、图像、视频等)均为<b>版权所有</b>至公司名称</p>
要定位的元素:
<p>All material (text, images, video, etc.) on this site are <b>copyrighted</b> to COMPANY NAME.</p>
VB。网络代码:
'Iterate all <p> tags.
For Each Element As HtmlElement In WebBrowser.Document.GetElementsByTagName("p")
If Element.InnerHtml.Contains("<b>copyrighted</b>") Then
'Found. Do something with 'Element'...
Exit For 'Stop looping.
End If
Next