这个html在我的页面中:
<tr>
<td class="padded2" bgcolor="#103A74"><font color="White">Refine by Vehicle Types</font></td>
</tr><tr>
<td class="padded2" bgcolor="White"><div>
<table border="0">
<tr>
<td class="padded2"><font color="#103A74"><ul><li><a class="padded2"> Cars</a></li><li><a class="padded2">Marine Engines</a></li><li><a class="padded2">Trucks</a></li></ul></font></td>
</tr>
</table>
</div></td>
</tr>
我想要根据他们追随“车型精炼”的事实来刮“汽车”和“卡车”。 我尝试过很多不同的方法,这个方法尽可能接近,但返回NULL。
$Nodes = $xPath->query("//tr/td/font[text()[contains(., 'Refine by Vehicle Type')]]/following-sibling::tr/td/div/table/tr/td/font/ul/li/a")->item(0)->nodeValue;
我错过了什么?
答案 0 :(得分:2)
您的错误在:
中...font[...]/following-sibling::tr/...
很容易看出,在提供的XML片段中,<font>
元素没有兄弟元素。
这是一个正确的XPath表达式:
tr[td[contains(., 'Refine by Vehicle Types')]]
/following-sibling::tr
/td/div/table
/tr/td/font
/ul/li/a
根据以下XML文档进行评估(您提供的片段由<table>
包装):
<table>
<tr>
<td class="padded2" bgcolor="#103A74">
<font color="White">Refine by Vehicle Types</font>
</td>
</tr>
<tr>
<td class="padded2" bgcolor="White">
<div>
<table border="0">
<tr>
<td class="padded2">
<font color="#103A74">
<ul>
<li>
<a class="padded2"> Cars</a>
</li>
<li>
<a class="padded2">Marine Engines</a>
</li>
<li>
<a class="padded2">Trucks</a>
</li>
</ul>
</font>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
选择了以下元素:
<a class="padded2"> Cars</a>
<a class="padded2">Marine Engines</a>
<a class="padded2">Trucks</a>
基于XSLT的验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<xsl:copy-of select=
"tr[td[contains(., 'Refine by Vehicle Types')]]
/following-sibling::tr
/td/div/table
/tr/td/font
/ul/li/a
"/>
</xsl:template>
</xsl:stylesheet>
在上面的XML文档中应用此转换时,会输出所选元素:
<a class="padded2"> Cars</a>
<a class="padded2">Marine Engines</a>
<a class="padded2">Trucks</a>
我建议您使用XPath Visualizer 快速编写正确优雅的XPath表达式。