phphtml-content-extraction

how to get href and text content by html Content


I am want to get content and url including all other td data.

my code:

$context = stream_context_create(
    array(
        "http" => array(
            "header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
        )
    )
);

$htmlContent = file_get_contents("https://www.iana.org/domains/root/db", false, $context);
    
$DOM = new DOMDocument();
$DOM->loadHTML($htmlContent);

$FirstdTable = $DOM->getElementsByTagName('table')->item(0);


$Header = $FirstdTable->getElementsByTagName('th');
$Detail = $FirstdTable->getElementsByTagName('td');

//#Get header name of the table
foreach($Header as $NodeHeader) 
{
    $aDataTableHeaderHTML[] = trim($NodeHeader->textContent);
}

//#Get row data/detail table without header name as key
$i = 0;
$j = 0;
foreach($Detail as $sNodeDetail)
{
   
    $aDataTableDetailHTML[$j][] = trim($sNodeDetail->textContent);
    $i = $i + 1;
    $j = $i % count($aDataTableHeaderHTML) == 0 ? $j + 1 : $j;
}

current output:

Array
(
    [0] => Array
        (
            [0] => .aaa
            [1] => generic
            [2] => American Automobile Association, Inc.
        )

    [1] => Array
        (
            [0] => .aarp
            [1] => generic
            [2] => AARP
        )

    [2] => Array
        (
            [0] => .abarth
            [1] => generic
            [2] => Fiat Chrysler Automobiles N.V.
        )
}

here i am want as:

Array
(
    [0] => Array
        (
            [0] => .aaa
            [1] => generic
            [2] => American Automobile Association, Inc.
            [3] => https://www.iana.org/domains/root/db/aaa.html
        )

    [1] => Array
        (
            [0] => .aarp
            [1] => generic
            [2] => AARP
            [3] => https://www.iana.org/domains/root/db/aarp.html
        )

    [2] => Array
        (
            [0] => .abarth
            [1] => generic
            [2] => Fiat Chrysler Automobiles N.V.
            [3] => https://www.iana.org/domains/root/db/abarth.html
        )
}

Solution

  • Currently, you're just getting all the text content within all <td>'s. And it's not going to include the link inside the anchor tags. To do so, you'll need to dig deeper into the <td>.

    Here's one way to do it using xpath:

    $xpath = new DOMXpath($DOM);
    $base = 'https://www.iana.org/';
    foreach($Detail as $sNodeDetail)
    {
        $aDataTableDetailHTML[$j][] = trim($sNodeDetail->textContent);
        if ($link = $xpath->evaluate("string(./span[contains(@class, 'domain')]/a/@href)", $sNodeDetail)) {
            $aDataTableDetailHTML[$j][] = "{$base}{$link}";
        }
        $i = $i + 1;
        $j = $i % count($aDataTableHeaderHTML) == 0 ? $j + 1 : $j;
    }
    

    Basically the query just extract the href value if the current <td> in the iteration has <span class="domain tld"><a href="xxxx">xxx</a></span> and get the href value.

    Another way is to iterate each <tr> instead of each <td>:

    $aDataTableDetailHTML = [];
    $DOM = new DOMDocument();
    $DOM->loadHTML($htmlContent);
    $xpath = new DOMXpath($DOM);
    $base = 'https://www.iana.org/';
    foreach($xpath->query('//table[@id="tld-table"]/tbody/tr') as $row) {
        $domain = trim($xpath->evaluate("string(./td[1])", $row));
        $type = $xpath->evaluate("string(./td[2])", $row);
        $tld_manager = $xpath->evaluate("string(./td[3])", $row);
        $url = $xpath->evaluate("string(./td[1]/span/a/@href)", $row);
        $aDataTableDetailHTML[] = [$domain, $type, $tld_manager, "{$base}{$url}"];
    }