1.浏览器经常更改HTML
浏览器经常更改为其提供的HTML,以使其“有效”。例如,如果您为浏览器提供服务,则此无效的HTML:
<table> <p>bad paragraph</p> <tr><td>Note that cells and rows can be unclosed (and valid) in HTML</table>
要呈现它,浏览器会很有帮助,并尝试使其成为有效的HTML,并将其转换为:
<p>bad paragraph</p><table> <tbody> <tr> <td>Note that cells and rows can be unclosed (and valid) in HTML</td> </tr> </tbody></table>
由于
<p>aragraph不能位于
<table>s之内,因此更改了上述内容,
<tbody>因此建议这样做。应用于源的更改可能因浏览器而异。有些会将无效元素放在表格之前,有些放在表格之后,有些放在内部单元格中,等等。
2. Xpath不是固定的,它们可以灵活地指向元素。
使用此“固定” HTML:
<p>bad paragraph</p><table> <tbody> <tr> <td>Note that cells and rows can be unclosed (and valid) in HTML</td> </tr> </tbody></table>
如果我们尝试定位
<td>单元格的文本,则以下所有内容将为您提供大致正确的信息:
//td//tr/td//tbody/tr/td/table/tbody/tr/td/table//*/text()
而这样的例子不胜枚举…
但是,一般而言,浏览器会为您提供最精确(且最不灵活)的XPath,它列出了DOM中的每个元素。在这种情况下:
/table[0]/tbody[0]/tr[0]/td[0]/text()
3.结论:给浏览器指定的Xpath通常无济于事
这就是为什么开发人员工具生成的XPath在尝试使用原始HTML时会经常为您提供错误的Xpath的原因。
该解决方案始终引用原始HTML,并使用灵活但精确的XPath。
检查持有价格的实际HTML:
<table border="0" cellspacing="0" cellpadding="0"> <tr> <td> <font > <div > <b> <font >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>
如果您想要价格,实际上只有一个地方可以看!
//span[@itemprop="price"]/text()
这将返回:
$149.95



