Autor Zpráva
kozelv
Profil *
Zdravím,

mám takový problém, mám HTML tabulku, která má 10 sloupců a v posledním sloupci jsou odkazy, které se snažím získat...
používám DOMDocument, a potřebuji tedy z 9.tého sloupce získat adresy odkazů..zkoušel jsem to nějak takto, ale nefunguje to, normálně mi při item(9)->nodeValue ukáže NÁZVY ODKAZU ( prostě to co je mezi <a href > TADY </a>... ) ale já potřebuji to co je v "href" - na každém řádku se vyskytuje někdy i 5 odkazů, někdy třeba žádný...viz příklad tabulky níže

  $dom = new DOMDocument();  
  $html = $dom->loadHTMLFile("tabulka.html");  
  $dom->preserveWhiteSpace = false;     
  $tables = $dom->getElementsByTagName('table');   
  $rows = $tables->item(0)->getElementsByTagName('tr');  

  foreach ($rows as $row)   
  {   
     
      $cols     = $row->getElementsByTagName('td');
      
      $reg      = $cols->item(0)->nodeValue; #radek 30
      $key      = $cols->item(1)->nodeValue;
      $nazov    = $cols->item(2)->nodeValue;      
      $doplnok  = $cols->item(3)->nodeValue;
      $stav     = $cols->item(4)->nodeValue;
      $atc      = $cols->item(5)->nodeValue;
      $vydaj    = $cols->item(6)->nodeValue;
      $vyrobca  = $cols->item(7)->nodeValue;
      $drzitel  = $cols->item(8)->nodeValue;
      $links    = $cols->item(9)->getElementsByTagName('href');  #radek 39

      foreach ($links as $link) {
             $xxx= $link->getAttribute('href').' | '.$tag->childNodes->item(0)->nodeValue;
      }

      $string   .= "$reg@$key@$nazov@$doplnok@$stav@$atc@$vydaj@$vyrobca@$drzitel@$xxx\r\n";
    } 
    
    $fh = fopen("data.txt", 'w'); 
    fwrite($fh, $string); 
    fclose($fh);    
  

píše mi to pořád


PHP Notice:  Trying to get property of non-object in ..ble.php on line 30
PHP Notice:  Trying to get property of non-object in ..ble.php on line 31
PHP Notice:  Trying to get property of non-object in ..ble.php on line 32
PHP Notice:  Trying to get property of non-object in ..ble.php on line 33
PHP Notice:  Trying to get property of non-object in ..ble.php on line 34
PHP Notice:  Trying to get property of non-object in ..ble.php on line 35
PHP Notice:  Trying to get property of non-object in ..ble.php on line 36
PHP Notice:  Trying to get property of non-object in ..ble.php on line 37
PHP Notice:  Trying to get property of non-object in ..ble.php on line 38
PHP Fatal error:  Call to a member function getElementsByTagName() on a non-object in ..ble.php on line 39

HTML Tabulka vypadá takto

 <table border="1" width="100%">

  <tr><td>99/88/55</td><td>ABCDEF</td><td>Ichbin Salamus</td><td>exp 7x 5ff 95fe 2</td><td>D</td><td>V9999ES</td><td>R</td><td>GR</td><td>WE</td><td>&nbsp;<a href="documents/fewa516.txt">1</a>&nbsp;<a href="documents/nta516g.pdf">2</a>&nbsp;</td></tr>
  <tr><td>29/29/45</td><td>JUTZRN</td><td>vGrhH GGCHUw</td><td>efewa grw  2</td><td>D</td><td>GTR198V</td><td>R</td><td>GR</td><td>WE</td><td>&nbsp;<a href="documents/v1vr5e.txt">1</a>&nbsp;<a href="documents/q1f56x.pdf">2</a>&nbsp;<a href="documents/hrt198v.pdf">3</a>&nbsp;</td></tr>

  </table>
Mike8748
Profil
kozelv:
a si si jistý že v daném HTML není více tabulek?
skus var_dump($rows); jestli tam vubec je to co si myslíš že tam být má


btw, $links = $cols->item(9)->getElementsByTagName('href');
element se jménem href neznam :)
kozelv
Profil *
nenapadá mě jak jinak to řešit, přez simple:_html_dom mi to hází fatal error s memory, jelikož je html soubor dost velký...potřebuji při nejlepším


1) přečíst tabulku
2) zjistit z každého řádku text v 2. sloupci (zleva)
3) z posledního sloupce získat všechny ODKAZY ( tedy to co je v href="" ..odkazy jsou různě, někdy 2 někdy 5)
Mike8748
Profil
kozelv:
to je sice hezký, ale...
pokud chceš poradit, bylo by dobré ukázat zdrojovou HTML tabulku (celý HTML dokument).
muj názor je že vstupní HTML má jinou strukturu než myslíš, proto dotazy getElementsByTagName() nevrací výsledky a vede to právě k uvedeným chybám.

pokud nedodáš dost informací tak odpověď bude jenom "máš to rozbitý"
kozelv
Profil *
Takto vypadá HTML soubor, nechal jsem tam 2 řádky...ostatní jsou totožné akorát s jinými texty

<html>
  <head>
  <meta http-equiv="Content-Language" content="sk">
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
  <title>DNX a VTG</title>
  </head>
  <body>
  <table border="1" width="100%">
  <tr><th>REG.Č</th><th>KEY</th><th>NAME</th><th>GINFO</th>
    <th>IDX</th>
    <th>SMX</th>
    <th>TYPE</th>
    <th>VGX</th>
    <th>ACCONT</th>
    <th>DNX&nbsp;-&nbsp;VTG</th></tr>
    
  <tr><td>99/88/55</td><td>ABCDEF</td><td>Ichbin Salamus</td><td>exp 7x 5ff 95fe 2</td><td>D</td><td>V9999ES</td><td>R</td><td>GR</td><td>WE</td><td>&nbsp;<a href="documents/fewa516.txt">DNX</a>&nbsp;<a href="documents/nta516g.pdf">VTG</a>&nbsp;</td></tr>
  <tr><td>29/29/45</td><td>JUTZRN</td><td>vGrhH GGCHUw</td><td>efewa grw  2</td><td>D</td><td>GTR198V</td><td>R</td><td>GR</td><td>WE</td><td>&nbsp;<a href="documents/v1vr5e.txt">DNX</a>&nbsp;<a href="documents/q1f56x.pdf">VTG</a>&nbsp;<a href="documents/hrt198v.pdf">DNX</a>&nbsp;</td></tr>
 
  </table>  </body> </html>
    
Kcko
Profil
kozelv:
A tato data způsobují memory leak při použití HtmlDomSimple?
kozelv
Profil *
ano, jelikoz je tam tech radku cca 80 000
_es
Profil
kozelv:
je tam tech radku cca 80 000
Tak prečo tie dáta neukladáš a nespracovávaš nejako na ten účel vhodnejšie - napríklad cez databázu?
kozelv
Profil *
tyto data si nevymyslim ja, dostavam je kazdym mesicem. Proto se snazim z nich veci vykouzlit a pote je zapisu do mysql, az se povede to vycarovat z toho
Mike8748
Profil
kozelv:
skus do kódu co si uváděl hned na začátku doplnit na řádek 6 (podle číslování zde na diskuzi) doplnit
unset($rows[0]);
případně na řádku 11 doplnit podmínku
if ($cols==null) continue;
kozelv
Profil *
Po přidání unset($rows[0]);

PHP Fatal error: Cannot use object of type DOMNodeList as array in..
Mike8748
Profil
kozelv:
ta druhá podmínka (pro řádek 11) by měla stačit sama o sobě.

tvůj problém je, že první TR který z DomDocumentu vytáhneš, neobsahuje žádný TD, takže $cols = $row->getElementsByTagName('td'); nic nevrátí, a ty se na tom nic snažíš volat další metody. tomu prosttě nějak musíš zabránit, např. právě podmínkou if ($cols==null) continue; která v případě nenalezených TD bude pokračovat dalším TR
kozelv
Profil *
To je mi celkem jedno, ja jsem psal, ze mi to funguje, jen nevim, jak z 9.tho sloupce ziskat ty odkazy, jelikoz se mi tam zorbazuje jen misto odkazu toto: A`DNX A`VTG...ale toto je to, co je mezi <a>TADY</a>a ja potrebuji vypsat to co je v href=""
Mike8748
Profil
kozelv:
jedno to neni, ale budiž

na řádku 21 načítáš elementy s názvem href, nic takového v HTML není (místo 'href' tam má být 'a')
takže např.
$links    = $cols->item(9)->getElementsByTagName('href');  #radek 39
   $xxx='';
      foreach ($links as $link) {
             $xxx.= $link->getAttribute('href').' | ';
      }
tím do $xxx získáš seznam odkazů (případně přes $link->nodeValue získáš text odkazu jestli je třeba)
kozelv
Profil *
tady na tomto řádku mi to píše pořád

$links    = $cols->item(9)->getElementsByTagName('a'); 
PHP Fatal error: Call to a member function getElementsByTagName()
Mike8748
Profil
kozelv:
jistě že to způsobí fatal error, když na řádku 10 načítáš neexistující TD elementry a následně se z těch neexistujících elementů snažíš vytáhnout neexistující odkazy
bez podmínky jestli $cols opravdu obsahuje TD elementy se dál nehneš.

edit: tak mě napadlo pokud nefunguje ta podmínka if ($cols==null) continue; tak možná if ($cols->length==0) continue;
kozelv
Profil *
Ha, funguje, skvěle !! jenom je problém, když to pustím na ten velký html soubor, tak mi to hodí

PHP Fatal error: Maximum execution time of 30 seconds exceeded in...
Mike8748
Profil
kozelv:
si tem limit zvětši, http://cz2.php.net/manual/en/function.set-time-limit.php
kozelv
Profil *
To zkouším, zatím jsem došel k tomuto: FATAL Error : Script timed out before returning headers


nebo mi to hodí

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.
...
Mike8748
Profil
kozelv:
FATAL Error : Script timed out before returning headers
to bude souviset s tim že tvuj skript běží opravdu dlouho a přitom negeneruje žádný výstup, takže to webserver po nějakém čase vzdá a skončí to na téhle chybě.

bez znalosti co ten skript dál dělá, jestli je v jinej stránce atd blbý radit, můžeš např. skusit do toho skriptu zakomponovat nějaký výstup, např.
$i=0;
foreach ($rows as $row)   
  {   
  ...stavajici kod....
  
  
  if ($i%1000==0) echo "Zpracovano $i zaznamu\n";
  $i++;
  }
 

pak to každých 1000 řádek něco vypíše, skript tedy bude mít výstup a webserver bude poslušně čekat na skončení skriptu.
kozelv
Profil *
Hodil jsem tam rovnou mysql query, aby to rovnou zapisovalo, sice po dobe mi to hodilo opet fatal error, ale v PMA vidim, ze ten script stale zapisuje..

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: