DOMDOCUMENT - 没有正确获取内容
DOMDOCUMENT - not getting content correctly
我正在努力从下面的简化来源 HTML:
中找到下面这些 <td>
的各个单元格内容
<table id='tableid'>
<thead>
<tr>
<th>Column 1</th>
<th>Column 2</th>
<th>Column 3</th>
<th>Column 4</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href='/link?variable=15'>Text1</a></td>
<td class='color-4'>Text2</td>
<td>Text3</td>
<td>Text4</td>
</tr>
<tr>
<td><a href='/link?variable=27'>Text5</a></td>
<td class='color-1'>Text6</td>
<td>Text7</td>
<td>Text8</td>
</tr>
[...] // Shortened for brevity
</tbody>
</table>
缩短代码:
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTML($this->DOM);
$table = $doc->getElementById('tableid');
print_r($table);
foreach ($table->childNodes as $table_node) {
if (!empty($table_node->tagName) && $table_node->tagName == 'tbody') {
if (!empty($table_node->childNodes)) {
foreach ($table_node->childNodes as $table_row) {
print_r($table_row->childNodes);
}
}
}
}
我从上述 table 级别的代码中得到以下(简化的)反馈:
DOMElement Object
(
[tagName] => table
[schemaTypeInfo] =>
[nodeName] => table
[nodeValue] =>
Text1Text2Text3Text4
Text5Text6Text7Text8
[nodeType] => 1
[parentNode] => (object value omitted)
[childNodes] => (object value omitted)
);
并且在行级别:
DOMNodeList Object
(
[length] => 0
)
唯一与 HTML 不同的是 <a>
标签中的单引号和 table 的 id
,但是,我对此表示怀疑造成了麻烦,因为它找到了 tableid 就好了。
此时,我没有看到 table 行的子节点,table 的节点值是从其子节点中剥离标签的文本。我希望能够遍历到 <tr>
s 和 <td>
s
有什么想法吗?
由于您处理的是 html 文档,使用 xpath 可能更简单:
$xpath = new DOMXpath($doc);
$exp = "//table/tbody//tr";
$targets = $xpath->evaluate($exp);
for ($i = 0; $i < $targets->length; $i++) {
echo $targets->item($i) ->nodeValue. "\n";
}
或使用foreach
:
foreach ($targets as $target) {
$entries = $xpath->evaluate('.//td',$target);
foreach ($entries as $entry){
echo $entry->nodeValue . "\n";
}
echo "\n";
}
输出:
Text1
Text2
Text3
Text4
Text5
Text6
Text7
Text8
我正在努力从下面的简化来源 HTML:
中找到下面这些<td>
的各个单元格内容
<table id='tableid'>
<thead>
<tr>
<th>Column 1</th>
<th>Column 2</th>
<th>Column 3</th>
<th>Column 4</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href='/link?variable=15'>Text1</a></td>
<td class='color-4'>Text2</td>
<td>Text3</td>
<td>Text4</td>
</tr>
<tr>
<td><a href='/link?variable=27'>Text5</a></td>
<td class='color-1'>Text6</td>
<td>Text7</td>
<td>Text8</td>
</tr>
[...] // Shortened for brevity
</tbody>
</table>
缩短代码:
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTML($this->DOM);
$table = $doc->getElementById('tableid');
print_r($table);
foreach ($table->childNodes as $table_node) {
if (!empty($table_node->tagName) && $table_node->tagName == 'tbody') {
if (!empty($table_node->childNodes)) {
foreach ($table_node->childNodes as $table_row) {
print_r($table_row->childNodes);
}
}
}
}
我从上述 table 级别的代码中得到以下(简化的)反馈:
DOMElement Object
(
[tagName] => table
[schemaTypeInfo] =>
[nodeName] => table
[nodeValue] =>
Text1Text2Text3Text4
Text5Text6Text7Text8
[nodeType] => 1
[parentNode] => (object value omitted)
[childNodes] => (object value omitted)
);
并且在行级别:
DOMNodeList Object
(
[length] => 0
)
唯一与 HTML 不同的是 <a>
标签中的单引号和 table 的 id
,但是,我对此表示怀疑造成了麻烦,因为它找到了 tableid 就好了。
此时,我没有看到 table 行的子节点,table 的节点值是从其子节点中剥离标签的文本。我希望能够遍历到 <tr>
s 和 <td>
s
有什么想法吗?
由于您处理的是 html 文档,使用 xpath 可能更简单:
$xpath = new DOMXpath($doc);
$exp = "//table/tbody//tr";
$targets = $xpath->evaluate($exp);
for ($i = 0; $i < $targets->length; $i++) {
echo $targets->item($i) ->nodeValue. "\n";
}
或使用foreach
:
foreach ($targets as $target) {
$entries = $xpath->evaluate('.//td',$target);
foreach ($entries as $entry){
echo $entry->nodeValue . "\n";
}
echo "\n";
}
输出:
Text1
Text2
Text3
Text4
Text5
Text6
Text7
Text8