2016-11-24 8 views
1

Я использую CURL для извлечения страницы и хранения HTML. Я делаю это успешно и в конечном итоге с переменной, содержащей HTML, похожий на этот (содержание в тд не то же самое, и всегда изменяется):Анализ HTML-кода для поиска определенных элементов в PHP

html code above.... 

    <tr class="myclass"> 
    <td>Dynamic Content One</td> 
    <td>Dynamic Content Two</td> 
    <td>Dynamic Content Three</td> 
    </tr> 

    <tr class="myclass"> 
    <td>Dynamic Content One</td> 
    <td>Dynamic Content Two</td> 
    <td>Dynamic Content Three</td> 
    </tr> 

    More of the same <tr> ...... 

html code below.... 

Моя цель сейчас, чтобы разобрать HTML и иметь ассоциативный массив называется результат (а), который хранит все <tr> в качестве элементов, массив должен выглядеть следующим образом:

$result[0]["first_content"] = "Dynamic Content One" 
$result[0]["second_content"] = "Dynamic Content Two" 
$result[0]["third_content"] = "Dynamic Content Three" 

$result[1]["first_content"] = "Dynamic Content One" 
$result[1]["second_content"] = "Dynamic Content Two" 
$result[1]["third_content"] = "Dynamic Content Three" 

.. more elements in array depending on how many <tr> there was 

Я нашел, что это тихое сложно разобрать что-то вроде этого. Я использовал модуль DOMdocument и модуль DOMXpath, но все, что я достиг, имеет массив, содержащий элементы для каждого <td>, и не уверен, где я помещал алгоритмы для их хранения в массивы. Возможно, есть лучший способ сделать это? Вот мой текущий код:

$dom = new DOMDocument; 
     @$dom -> loadHTML($retrievedHtml); 

     $xPath = new DOMXpath($dom); 

     $xPathQuery = "//tr[@class='myclass']"; 
     $elements = $xPath -> query($xPathQuery); 

     if(!is_null($elements)){ 

      $results = array(); 

      foreach($elements as $element){ 

       $nodes = $element -> childNodes; 

       print $nodes -> nodeValue; 

       foreach($nodes as $node){ 
        $results[] = $node -> nodeValue; 
       } 

      } 

ответ

0

Для достижения структуры выходного массива (минус текстовые клавиши, такие как «first_content» и т.д.), то для каждой строки добавить новое измерение в массив и заполнить это измерение. Я думаю, это то, чего вы пытались достичь в любом случае!

$dom = new DOMDocument; 
@$dom->loadHTML($retrievedHtml); 

$xPath = new DOMXpath($dom); 

$xPathQuery = "//tr[@class='myclass']"; 
$elements = $xPath -> query($xPathQuery); 

if(!is_null($elements)){ 

    $results = array(); 

    foreach($elements as $index => $element){ 

     $nodes = $element -> childNodes; 

     foreach($nodes as $subindex => $node){ 
      /* Each table row is assigned in new level in array using $index */ 
      if($node->nodeType == XML_ELEMENT_NODE) $results[ $index ][] = $node->nodeValue; 
     } 
    } 

    echo '<pre>',print_r($results, true),'</pre>'; 
} 
+0

это работает. есть ли что-нибудь, за чем я должен следить? например, если nodetype не является XML_ELEMENT_NODE? не знаю, что это значит –

 Смежные вопросы

  • Нет связанных вопросов^_^