虽然我在整个项目中一直使用DomCralwer,但是这个XPath查询存在错误<![CDATA[ / ]]>
因此,作为解决方法,我尝试使用内置版本-in功能:
//table[*[self::tbody or self::thead or self::tfoot]/tr[count(*) = 2]]
...但输出是意料之外的:
for ($i=0; $i < count($tables); $i++) {
$tables[$i] = purifyTables($tables[$i]);
echo($tables[$i]);
$dom = new DOMDocument();
$dom->loadHTML( $tables[$i] );
$xpath = new DOMXPath($dom);
$nodes = $xpath->query("//table[*[self::tbody or self::thead or self::tfoot]/tr[count(*) = 2]]");
echo($nodes);
echo($dom->saveHTML($nodes));
}
答案 0 :(得分:2)
你的XPath表达
//table[*[self::tbody or self::thead or self::tfoot]/tr[count(*) = 2]]
选择所有table
个tbody
,thead
或tfoot
孩子(只有其中一个),tr
孩子只有两个孩子节点。由于示例HTML中的表与表达式不匹配,因此您将得到一个空的DOMNodeList
。它不匹配,因为table
元素没有列出的子项(tbody
,thead
或tfoot
)。
在对问题的评论中,我发现您正在尝试使用两列完整地获取所有表。您可以使用以下XPath表达式执行此操作:
//table[(.|tbody|thead|tfoot)/tr[count(td) = 2]]
标记tbody
,thead
和tfoot
是可选的,因为包含对表标记(.
)的引用到OR'd元素序列中。 count
函数仅选择td
个元素。