<h2>1。浏览器经常更改HTML</h2>
<p>浏览器经常更改提供给它的HTML,使其“有效”。例如,如果为浏览器提供此无效的HTML:</p>
<pre><code><table>
<p>bad paragraph</p>
<tr><td>Note that cells and rows can be unclosed (and valid) in HTML
</table>
</code></pre>
<p>要呈现它,浏览器很有帮助,并尝试使其成为有效的HTML,并可能将其转换为:</p>
^{pr2}$
<p>以上更改是因为<code><p></code>阿拉伯文字不能在<code><table></code>s内,建议使用<code><tbody></code>s。应用于源代码的更改因浏览器而异。一些将把无效元素放在表之前,一些放在之后,一些放在单元格内,等等。。。在</p>
<h2>2。xpath不是固定的,它们可以灵活地指向元素</h2>
<p>使用此“固定”HTML:</p>
^{pr2}$
<p>如果我们试图以<code><td></code>细胞的文本为目标,以下所有内容将大致为您提供正确的信息:</p>
<pre><code>//td
//tr/td
//tbody/tr/td
/table/tbody/tr/td
/table//*/text()
</code></pre>
<p>名单还在继续。。。在</p>
<p>但是,在一般情况下,浏览器将提供最精确(也是最不灵活)的XPath,它列出了DOM中的每个元素。在这种情况下:</p>
<pre><code>/table[0]/tbody[0]/tr[0]/td[0]/text()
</code></pre>
<h2>3。结论:浏览器提供的xpath通常没有帮助</h2>
<p><strong>这就是为什么开发人员工具生成的Xpath在尝试使用原始HTML时经常会给出错误的Xpath。</strong></p>
<p>解决方案始终引用原始HTML并使用灵活但精确的XPath。在</p>
<p>检查保存价格的实际HTML:</p>
<pre><code><table border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<font class="pricecolor colors_productprice">
<div class="product_productprice">
<b>
<font class="text colors_text">Price:</font>
<span itemprop="price">$149.95</span>
</b>
</div>
</font>
<br/>
<input type="image" src="/v/vspfiles/templates/MAKO/images/buttons/btn_updateprice.gif" name="btnupdateprice" alt="Update Price" border="0"/>
</td>
</tr>
</table>
</code></pre>
<p>如果你想要价格,实际上只有一个地方可以看!在</p>
<pre><code>//span[@itemprop="price"]/text()
</code></pre>
<p>这将返回:</p>
<pre><code>$149.95
</code></pre>