在PHP中操作DOM

时间:2016-12-10 08:55:29

标签: php symfony dom xpath

虽然我在整个项目中一直使用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));

}

1 个答案:

答案 0 :(得分:2)

你的XPath表达

//table[*[self::tbody or self::thead or self::tfoot]/tr[count(*) = 2]]

选择所有tabletbodytheadtfoot孩子(只有其中一个),tr孩子只有两个孩子节点。由于示例HTML中的表与表达式不匹配,因此您将得到一个空的DOMNodeList。它不匹配,因为table元素没有列出的子项(tbodytheadtfoot)。

在对问题的评论中,我发现您正在尝试使用两列完整地获取所有表。您可以使用以下XPath表达式执行此操作:

//table[(.|tbody|thead|tfoot)/tr[count(td) = 2]]

标记tbodytheadtfoot是可选的,因为包含对表标记(.)的引用到OR'd元素序列中。 count函数仅选择td个元素。