1

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

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

4

3 回答 3

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>
于 2013-05-24T06:27:56.363 回答
0

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

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

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

于 2013-09-11T08:26:23.227 回答
-1

你没有设置$trVal$tdVal但你正在循环它们?

于 2013-05-24T01:12:13.410 回答