2013-12-04 9 views
0

У меня есть особая проблема, которую я не могу взломать. Я искал каждый учебник или записи в форме, но не имел успеха в том, что мне нужно делать. Так что мой HTML-файл:простой парсер файлов HTML с php

<html> 
<head>**SOMETHING HERE**</head> 
<body> 
    <div> 
    <table> 
    <thead> 
    <tr><th>TEXT/NUM IS HERE</th><th>TEXT/NUM IS HERE</th><th>TEXT/NUM IS HERE</th></tr> 
    </thead><tbody>**SOMETHING HERE**</tbody></tfoot>**SOMETHING HERE**</tfoot> 
    </table> 
    </div> 
</body> 
</html> 

Что мне нужно, чтобы пройти через каждый тег (й) в «THEAD => тр» тег и запишите значение между этими метками «й» в массив;

Для этого я планировал использовать DOMDocument и DOMXPath.

Там было много способов, которыми я пытался решить эту проблему, но большинство нашли один онлайн было:

$file = "index.html"; 
$dom = new DOMDocument(); 
$dom->loadHTMLfile($file); 
$thead = $dom->getElementsByTagName('thead'); 
$thead->parentNode; 
$th = $thead->getElementsByTagName('th') 
echo $th->nodeValue . "\n"; 

Но я все еще получаю много ошибок и не могу найти способ сделать это. Есть ли способ сделать этот приятный конец простым и, конечно, элементом foreach в родительском элементе.

спасибо.

+1

* getElementsByTagName *. Элементы. Не элемент, а элементы. Он возвращает [DOMNodeList] (http://dk1.php.net/manual/en/class.domnodelist.php), как указано в руководстве. Вам нужно пройти через это. – h2ooooooo

ответ

1
<?php 
$html = new file_get_html('file.html'); 
$th = $html->find('thead th'); 
$array = array(); 
foreach($th as $text) 
    $array[] = $th->innertext; 
?> 

Это использует простой HTML DOM Parser, который можно найти here.

3

Использование DOMXPath:

$html = <<<EOL 
<html> 
    <head>**SOMETHING HERE**</head> 
    <body> 
     <div> 
      <table> 
       <thead> 
        <tr> 
         <th>TEXT/NUM IS HERE</th> 
         <th>TEXT/NUM IS HERE</th> 
         <th>TEXT/NUM IS HERE</th> 
        </tr> 
       </thead> 
       <tbody>**SOMETHING HERE**</tbody> 
       <tfoot>**SOMETHING HERE**</tfoot> 
      </table> 
     </div> 
    </body> 
</html> 
EOL; 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 

$nodes = $xpath->query('//table/thead/tr/th'); 

$data = array(); 

foreach ($nodes as $node) { 
    $data[] = $node->textContent; 
} 

print_r($data); 
0

Если вы хотите сохранить его в том же стиле, что у вас есть (и, следовательно, узнайте, что вы сделали неправильно):

$file = "index.html"; 
$dom = new DOMDocument(); 
$dom->loadHTMLfile($file); 

$oTHeadList = $dom->getElementsByTagName('thead'); 

foreach($oTHeadList as $oThisTHead){ 

    $oThList = $oThisTHead->getElementsByTagName('th'); 

    foreach($oThList as $oThisTh) { 

     echo $oThisTh->nodeValue . "\n"; 
    } 
} 

В принципе " getElementsByTagName "возвращает NodeList вместо узла, поэтому вам нужно перебирать их, чтобы добраться до отдельных узлов.

Кроме того, в вашем HTML у вас есть закрытие tfoot вместо открытия одного, и если вы проверяете с помощью HTML документа вы предоставили, то в **SOMETHING HERE** внутри вашей головы тег будет вызывать предупреждения, которые будут выброшены (как и любые другие недопустимый HTML).

Если вы хотите отключить предупреждения, вы можете добавить «@», но не рекомендуется перемахивать этим символом слишком сильно вокруг вашего кода.

@$dom->loadHTMLfile($file); 
Смежные вопросы