我正在尝试使用php dom获取子元素的文本。
具体来说,我想在每个<a>
中只获取第一个<tr>
标记。
HTML就是这样......
<table>
<tbody>
<tr>
<td>
<a href="#">1st Link</a>
</td>
<td>
<a href="">2nd Link</a>
</td>
<td>
<a href="#">3rd Link</a>
</td>
</tr>
<tr>
<td>
<a href="#">1st Link</a>
</td>
<td>
<a href="#">2nd Link</a>
</td>
<td>
<a href="#">3rd Link</a>
</td>
</tr>
</tbody>
</table>
我对它的悲惨尝试涉及使用foreach()
循环,但只会在Array()
上执行print_r()
时返回$aVal
。
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML(returnURLData($url));
libxml_use_internal_errors(false);
$tables = $dom->getElementsByTagName('table');
$aVal = array();
foreach ($tables as $table) {
foreach ($table as $tr){
$trVal = $tr->getElementsByTagName('tr');
foreach ($trVal as $td){
$tdVal = $td->getElementsByTagName('td');
foreach($tdVal as $a){
$aVal[] = $a->getElementsByTagName('a')->nodeValue;
}
}
}
}
我是在正确的轨道还是我完全离开了?
答案 0 :(得分:2)
将此代码放入test.php
require 'simple_html_dom.php';
$html = file_get_html('test1.php');
foreach($html->find('table tr') as $element)
{
foreach($element->find('a',0) as $element)
{
echo $element->plaintext;
}
}
并将您的html代码放在test1.php
中<table>
<tbody>
<tr>
<td>
<a href="#">1st Link</a>
</td>
<td>
<a href="">2nd Link</a>
</td>
<td>
<a href="#">3rd Link</a>
</td>
</tr>
<tr>
<td>
<a href="#">1st Link</a>
</td>
<td>
<a href="#">2nd Link</a>
</td>
<td>
<a href="#">3rd Link</a>
</td>
</tr>
</tbody>
</table>
答案 1 :(得分:0)
我很确定我迟到了,但更好的方法应该是遍历所有&#34; tr&#34;使用getElementByTagName然后在迭代通过nodelist中的每个节点时使用getElementByTagName&#34; a&#34;。现在无需遍历nodeList指出由item(0)收到的第一个元素。那就是它!另一种方法是使用xPath。
我个人不喜欢SimpleHtmlDom,因为在需要小功能的情况下,它会使用额外添加的功能。如果你的内存管理问题很严重,那么内存管理问题会阻碍你,如果你自己做DOM分析而不是依赖第三方应用程序,它会更好。
只是我的意见。即使我最初使用过SHD,但后来意识到这一点。
答案 2 :(得分:-1)
你还没有设置$trVal
和$tdVal
但是你正在循环它们吗?