PHP';s DOMXpath无法返回子节点的完整集
我有9个表行,但使用DOMXpath查询顶级节点时只返回3行PHP';s DOMXpath无法返回子节点的完整集,php,xpath,Php,Xpath,我有9个表行,但使用DOMXpath查询顶级节点时只返回3行 <table class="something"> <tbody> <tr> <td class="label">One</td> <td>111111</td> </tr> <tr> <td c
<table class="something">
<tbody>
<tr>
<td class="label">One</td>
<td>111111</td>
</tr>
<tr>
<td class="label">Two</td>
<td>1454</td>
</tr>
<tr>
<td class="label">Three</td>
<td></td>
</tr>
<tr>
<td class="label">Four</td>
<td>0</td>
</tr>
<tr>
<td class="label">Five</td>
<td>45</td>
</tr>
<tr>
<td class="label">Six</td>
<td>45</td>
</tr>
<tr>
<td class="label">Seven</td>
<td>5</td>
</tr>
<tr>
<td class="label">Eight</td>
<td>0</td>
</tr>
<tr>
<td class="label">Nine</td>
<td>0</td>
</tr>
</tbody>
</table>
$request = drupal_http_request($url);
$data = $request->data;
$doc = new DOMDocument;
@$doc->loadHTML($data);
$tables = $doc->getElementsByTagName('table');
$rows = $tables->item(2)->getElementsByTagName('tr');
$output = '';
foreach($rows as $row) {
$cols = $row->getElementsByTagName('td');
foreach($cols as $col){
$output .= $col->nodeValue . '<br/>';
}
}
return $output;
不幸的是,没有返回完整的表行集——只有前三行。我猜空元素
以某种方式抛出了xpath解析器。有解决办法吗
编辑:
我正在尝试另一种不使用DOMXpath的方法
<table class="something">
<tbody>
<tr>
<td class="label">One</td>
<td>111111</td>
</tr>
<tr>
<td class="label">Two</td>
<td>1454</td>
</tr>
<tr>
<td class="label">Three</td>
<td></td>
</tr>
<tr>
<td class="label">Four</td>
<td>0</td>
</tr>
<tr>
<td class="label">Five</td>
<td>45</td>
</tr>
<tr>
<td class="label">Six</td>
<td>45</td>
</tr>
<tr>
<td class="label">Seven</td>
<td>5</td>
</tr>
<tr>
<td class="label">Eight</td>
<td>0</td>
</tr>
<tr>
<td class="label">Nine</td>
<td>0</td>
</tr>
</tbody>
</table>
$request = drupal_http_request($url);
$data = $request->data;
$doc = new DOMDocument;
@$doc->loadHTML($data);
$tables = $doc->getElementsByTagName('table');
$rows = $tables->item(2)->getElementsByTagName('tr');
$output = '';
foreach($rows as $row) {
$cols = $row->getElementsByTagName('td');
foreach($cols as $col){
$output .= $col->nodeValue . '<br/>';
}
}
return $output;
$request=drupal\u http\u请求($url);
$data=$request->data;
$doc=新文档;
@$doc->loadHTML($data);
$tables=$doc->getElementsByTagName('table');
$rows=$tables->item(2)->getElementsByTagName('tr');
$output='';
foreach($行作为$行){
$cols=$row->getElementsByTagName('td');
foreach($cols作为$col){
$output.=$col->nodeValue.“
”;
}
}
返回$output;
这两种方法都输出此HTML:
<div class="content">
One<br>111111<br>Two<br>1454<br>Three<br><br>
</div>
一个
111111
两个
1454
三个
在第一个示例中,$tableRows->length为3,与输出一致,但与包含9行的标记不一致。我正在抓取一个包含无效、损坏、脏HTML的网页。我想我喜欢整洁有序。相反,我使用脚本来解析HTML,它工作得很好。不确定这是一个转录错误还是代码输入错误,但上面的table类是有意义的,而不是有意义的。其次,我通过该查询得到了8//tr结果,结果很好?您的XPath非常好。接下来的PHP代码是什么?可能问题就出在那里。可能是我正在刮一个标记不好的网页,并且正在扔掉它。完整的页面会很有帮助。一个很小的可能性是,你的显示例行程序是摆脱你?尝试遍历$tableRows:foreach($tableRows as$row){echo“{$row->nodeName}\n”}似乎在将“something”更正为“something”后工作: