如何使用DomDocument获取子元素?

时间:2013-05-24 01:07:14

标签: php loops html-table domdocument

我正在尝试使用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;
            }
        }
    }
}

我是在正确的轨道还是我完全离开了?

3 个答案:

答案 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但是你正在循环它们吗?