【问题标题】:How to use DOMDocument to get child elements?如何使用 DOMDocument 获取子元素?
【发布时间】:2013-05-19 13:00:41
【问题描述】:

我正在尝试使用 PHP DOM 获取子元素的文本。

具体来说,我试图只获取每个 <tr> 中的第一个 <a> 标记。

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() 循环,但在 $aVal 上执行 print_r() 时只会返回 Array()

$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;
            }
        }
    }
}

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

【问题讨论】:

    标签: php loops html-table domdocument


    【解决方案1】:

    您没有设置 $trVal$tdVal 而是循环它们?

    【讨论】:

    • 我更改代码时忘记切换这些...谢谢! (但它并没有解决问题)
    【解决方案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>
    

    【讨论】:

      【解决方案3】:

      我很确定我迟到了,但更好的方法应该是使用 getElementByTagName 遍历所有“tr”,然后在遍历收到的节点列表中的每个节点时使用 getElementByTagName“a”。现在不需要遍历 nodeList 指出 item(0) 收到的第一个元素。而已!另一种方法是使用 xPath。

      我个人不喜欢 SimpleHtmlDom,因为它在需要小功能的地方使用了许多额外的附加功能。在大量抓取的情况下,内存管理问题也会阻碍您,如果您自己进行 DOM 分析而不是依赖第三方应用程序会更好。

      只是我的意见。甚至我最初使用 SHD,但后来意识到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-18
        • 1970-01-01
        • 2016-11-11
        • 1970-01-01
        • 2017-08-10
        • 2013-02-17
        • 2011-04-17
        相关资源
        最近更新 更多