Скрести DOMDocument Table для содержимого в PHP

Я действительно изо всех сил пытаюсь очистить таблицу с помощью XPath или любого другого метода getElement. Я искал вокруг и пытался различными способами решить мою проблему ниже, но потерпел неудачу и действительно ценю любую помощь.

Во-первых, HTML-часть, которую я пытаюсь очистить, представляет собой 2-ю таблицу в документе и выглядит следующим образом:

<table class="table2" border="1" cellspacing="0" cellpadding="3">
<tbody>
<tr><th colspan="8" align="left">Status Information</th></tr>
<tr><th align="left">Status</th><th align="left">Type</th><th align="left">Address</th><th align="left">LP</th><th align="left">Agent Info</th><th align="left">Agent Email</th><th align="left">Phone</th><th align="center">Email Tmplt</th></tr>
<tr></tr>
<tr>
<td align="left">Active</td>
<td align="left">Resale</td>
<td align="center">*Property Address*</td>
<td align="right">*Price*</td>
<td align="center">*Agent Info*</td>
<td align="center">*Agent Email*</td>
<td align="center">*Agent Phone*</td>
<td align="center">&nbsp;</td>
</tr>
<tr>
<td align="left">Active</td>
<td align="left">Resale</td>
<td align="center">*Property Address*</td>
<td align="right">*Price*</td>
<td align="center">*Agent Info*</td>
<td align="center">*Agent Email*</td>
<td align="center">*Agent Phone*</td>
<td align="center">&nbsp;</td>
</tr>
...etc

С дополнительным продолжением trs, содержащим 8 tds с такой же информацией, как описано выше.

Что мне нужно сделать, так это перебрать trs и внутренние tds, чтобы подобрать каждый фрагмент информации (внутри td) для каждой записи (внутри tr).

Вот код, с которым я боролся:

<?php

$payload = array(
  'http'=>array(
     'method'=>"POST",
     'content'=>'key=value'
   )
);
stream_context_set_default($payload);
$dom = new DOMDocument();
libxml_use_internal_errors(TRUE);
$dom->loadHTMLFile('website-scraping-from.com');
libxml_clear_errors();

foreach ($dom->getElementsByTagName('tr') as $row){
    foreach($dom->$row->getElementsByTagName('td') as $node){
        echo $node->textContent . "<br/>";
    }

}


?>

Этот код не возвращает почти то, что мне нужно, и у меня много трудностей, пытаясь выяснить, как это исправить, возможно, XPath - лучший способ найти нужную мне таблицу / информацию, но я пришел с пустым этот метод также. Любая информация высоко ценится.

Если это имеет значение, моя конечная цель состоит в том, чтобы иметь возможность взять данные таблицы и вывести их в базу данных, если первое значение td имеет значение "Active".

1 ответ

Решение

Может ли это помочь?

$table = $dom->getElementsByTagName('table')->item(1);
foreach ($table->getElementsByTagName('tr') as $row){
    $cells = $row->getElementsByTagName('td');
    if ( $cells->item(0)->nodeValue == 'Active' ) {
        foreach($cells as $node){
            echo $node->nodeValue . "<br/>";
        }
    }
}

Это приведет к извлечению второй таблицы и отображению содержимого строк, начиная с первой ячейки "Active".

Изменить: Вот более обширная помощь:

$arr = array();
$table = $dom->getElementsByTagName('table')->item(1);
foreach ($table->getElementsByTagName('tr') as $row){
    $cells = $row->getElementsByTagName('td');
    if ( $cells->item(0)->nodeValue == 'Active' ) {
        $obj = new stdClass;
        $obj->type    = $cells->item(1)->nodeValue;
        $obj->address = $cells->item(2)->nodeValue;
        $obj->price   = $cells->item(3)->nodeValue;
        $obj->agent   = $cells->item(4)->nodeValue;
        $obj->email   = $cells->item(5)->nodeValue;
        $obj->phone   = $cells->item(6)->nodeValue;
        array_push( $arr, $obj );
    }
}
print_r( $arr );
Другие вопросы по тегам