Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Pobieranie przez DOM
Forum PHP.pl > Forum > Przedszkole
shtoc
Mam pytanie chcę pobrać ze strony za pomocą DOM znacznik "href" ale nie wychodzi możne ktoś widzi błąd ?

fragment strony:

  1. <table cellspacing="1" cellpadding="3" border="0" width="100%">
  2. </thead>
  3. <tr class="odd">
  4. <td>000000</td>
  5. <td>
  6.  
  7. <a title="TYTUŁ" href="http://www.domena.pl/">NAZWA</a>
  8. <br/>
  9.  
  10. </td>
  11. <td>MIASTO</td>
  12. </tr>



Kod php:

  1. <?php
  2. $pol=mysql_connect('localhost', 'root', '') or die('BÄąâ₏šĂ„â₏Œd poÄąâ₏šĂ„â₏Œczenia: '.mysql_error());
  3. mysql_selectdb('krs') or die('BÄąâ₏šĂ„â₏Œd wyboru bazy: '.mysql_error());
  4. mysql_query("SET NAMES utf8");
  5.  
  6. $adres="http://www.domena.pl/";
  7.  
  8. $url = curl_init($adres);
  9. curl_setopt($url, CURLOPT_USERAGENT, 'holmes/3.10.1 (OnetSzukaj/5.0; +http://szukaj.onet.pl)');
  10. curl_setopt($url, CURLOPT_RETURNTRANSFER, 1);
  11. curl_setopt($url, CURLOPT_CONNECTTIMEOUT, 5);
  12. curl_setopt($url, CURLOPT_HEADER, 0);
  13. $strona=curl_exec($url);
  14.  
  15.  
  16. $DOM = new DOMDocument();
  17. @$DOM->LoadHTML(iconv("UTF-8","UTF-8",$strona));
  18.  
  19.  
  20.        foreach($DOM->getElementsByTagName('tr') as $tr)
  21.        {            
  22.            $class = $tr->getAttribute('class');
  23.            if($class == 'odd' OR $class == 'add')
  24.            {
  25.                    foreach($td->getElementsByTagName('a') as $a)
  26.                    {
  27.                    $href = $a->getAttribute('href');                
  28.                    echo $href;
  29.                  
  30.                    //$sql="INSERT INTO krs (`adres`) VALUE ('$href')";
  31.                    //$dane = mysql_query($sql);
  32.                    //echo mysql_errno() . ": " . mysql_error();
  33.                    unset($href,$a);
  34.                    }
  35.  
  36.            }
  37.        
  38.        }
  39. ?>
golaod
Po pierwsze:
  1. <?php
  2. iconv("UTF-8","UTF-8",$strona);
  3. ?>

Po co takie cudo ? U mnie takie coś by zmieniło kodowanie na jakieś automagiczne niedostępne w tym wszechświecie.

Po drugie:
Nie znam się na DOM w php jednak skąd wziąłeś $td ? Bo ja widzę, że rzeczywiście znajdujesz tr o podanej klasie ale w drzewie zapomniałeś przejść do $td dla danego tr - lub chociaż zainicjować tablicę z takim poddrzewem
shtoc
  1. <?php
  2. iconv("UTF-8","UTF-8",$strona);
  3. ?>


bo ma zmieniać kodowanie.

faktycznie z $td chyba się walnąłem.

ale spróbowałem tak :

  1. <?php
  2. foreach($DOM->getElementsByTagName('tr') as $tr)
  3.        {            
  4.            $class = $tr->getAttribute('class');
  5.            if($class == 'odd' OR $class == 'add')
  6.            {
  7.                    foreach($tr->getElementsByTagName('td') as $td)
  8.                    {
  9.                        foreach($td->getElementsByTagName('a') as $a)
  10.                        {
  11.  
  12.                        $href = $a->getAttribute('href');
  13.                      
  14.  
  15.                        echo $href;
  16.                        
  17.                        $sql="INSERT INTO krs (`adres`) VALUE ('$href')";
  18.                        $dane = mysql_query($sql);
  19.                        echo mysql_errno() . ": " . mysql_error();
  20.                        unset($href,$a);
  21.                        }
  22.                    }
  23.  
  24.            }
  25.        
  26.        }
  27. ?>


ale nie daje oczekiwanego rezultatu :/
golaod
Cytat(shtoc @ 1.06.2009, 15:46:53 ) *
  1. <?php
  2. iconv("UTF-8","UTF-8",$strona);
  3. ?>


bo ma zmieniać kodowanie.


Z tego samego na to samo?


Co do DOM:
Z tego co widziałem w komentarzach do getElementsByTagName to ludzie się tam dla Twojego TD odwołują tak:
  1. <?php
  2. $tr->item(n)->getAttribute('name');#lub nodeValue
  3. ?>

Jak napisałem nie znam się jednak to wystarczy sobie samemu sprawdzać patrząc po kolei, co Ci daje przechodzenie pętlą foreach. No i oczywiście dokumentacja biggrin.gif

Albo sprawdź
  1. <?php
  2. echo $tr->length;
  3. ?>
shtoc
Wydaje mi się że błędy są gdzie na samym początku bo w pętlach w zmiennych nie ma żadnych wartości.
golaod
Wywal zatem iconv bo naprawdę idiotyczne jest zmienianie kodowania utf8 na utf8.
Po drugie sprawdź co znajduje się w tym co zwraca curl.
Aha i zdejmij @ z LoadHTML to może się dowiemy jaki jest błąd.
shtoc
  1. <?php
  2. $strona=curl_exec($url);
  3.  
  4.  
  5. $DOM = new DOMDocument();
  6. $DOM->LoadHTML;
  7. var_dump ($DOM);
  8. ?>


$strona ma w sobie stronę www deklarowana na poczatku

var_dump daje :
object(DOMDocument)#1 (0) { }

ok działa tak :

  1. <?php
  2. $DOM = new DOMDocument();
  3. $DOM->LoadHTML("$strona");
  4. ?>
golaod
Cytat(shtoc @ 1.06.2009, 16:21:44 ) *
  1. <?php
  2. $strona=curl_exec($url);
  3. $DOM = new DOMDocument();
  4. $DOM->LoadHTML;
  5. var_dump ($DOM);
  6. ?>


$strona ma w sobie stronę www deklarowana na poczatku

var_dump daje :
object(DOMDocument)#1 (0) { }

ok działa tak :

  1. <?php
  2. $DOM = new DOMDocument();
  3. $DOM->LoadHTML("$strona");
  4. ?>


A co się dziwić, że nie działało skoro było $DOM->LoadHTML; Nie podałeś źródła smile.gif
W każdym razie u mnie działa przechodzenie przez tr i potem td tak jak ty to robiłeś w foreach
shtoc
Mam jeszcze jeden problem również z DOM
a mianowicie :
Kod

    

<div id="top_produkt_firma">

  <div style="float:left">

<h1>NAzwa</h1>

    <table cellpadding="3" cellspacing="0">
    <tr><td><strong>NR:</strong></td><td>00000000000</td></tr>

    <tr><td><strong>Adres:</strong></td><td>Polna 5a<br />
40-301 Krakow</td></tr>
    <tr><td><strong>TEl:</strong></td><td>15464654</td></tr>
    </table>    
    </div>


Chciałem pobrać wartości NR: ADRES: TEL:
Niestety nie wychodzi mi czy ktoś widzi gdzieś błąd questionmark.gif


za pomocą
  1. <?php
  2. $pol=mysql_connect('localhost', 'root', '') or die('BÄąâ₏šĂ„â₏Œd poÄąâ₏šĂ„â₏Œczenia: '.mysql_error());
  3. mysql_selectdb('krs') or die('BÄąâ₏šĂ„â₏Œd wyboru bazy: '.mysql_error());
  4. mysql_query("SET NAMES utf8\");
  5.  
  6.  
  7. $adres="http://www.doeman.pl/";
  8.  
  9. $url = curl_init($adres);
  10. curl_setopt($url, CURLOPT_USERAGENT,'');
  11. curl_setopt($url, CURLOPT_RETURNTRANSFER, 1);
  12. curl_setopt($url, CURLOPT_CONNECTTIMEOUT, 5);
  13. curl_setopt($url, CURLOPT_HEADER, 0);
  14. $strona=curl_exec($url);
  15.  
  16.  
  17. $DOM = new DOMDocument();
  18. $DOM->LoadHTML(&#092;"$strona\");
  19.  
  20.  
  21. foreach($DOM->getElementsByTagName('div') as $div)
  22.    {
  23.        $id = $div ->getAttribute('id');
  24.        if($id == 'top_produkt_firma')
  25.        {
  26.        foreach($div->getElementsByTagName('div') as $div1)
  27.        {
  28.            $style = $div1->getAttribute('style');
  29.            if ($style == 'float:left')
  30.            {
  31.                 foreach($div1->getElementsByTagName('table') as $table)
  32.                    {
  33.                        foreach($table->getElementsByTagName('tbody') as $tbody)
  34.                        {
  35.                            foreach($tbody->getElementsByTagName('tr') as $tr)
  36.                            {
  37.                               foreach($tr->getElementsByTagName('td') as $td)
  38.                                {
  39.  
  40.                                        $dane = $td->nodeValue;
  41.                                        print_r($dane);
  42.                                        
  43.                                  
  44.                                }
  45.  
  46.                            }
  47.  
  48.                        }
  49.  
  50.                    }            
  51.        
  52.            }
  53.        }
  54.  
  55.        }
  56.    }
  57.  
  58. ?>
golaod
A no widzę:
Kod
<table cellpadding="3" cellspacing="0">
    <tr><td><strong>NR:</strong></td><td>00000000000</td></tr>


  1. <?php
  2. foreach($div1->getElementsByTagName('table') as $table)
  3.                   {
  4.                       foreach($table->getElementsByTagName('tbody') as $tbody) # <-- questionmark.gifquestionmark.gifquestionmark.gif?
  5.                       {
  6.                           foreach($tbody->getElementsByTagName('tr') as $tr)
  7. ?>
shtoc
poszlo tak smile.gif + trochę str_replace + explode i gra gitara smile.gif

  1. <?php
  2. foreach($DOM->getElementsByTagName('div') as $div)
  3.    {
  4.        $id = $div ->getAttribute('id');
  5.        if($id == 'top_produkt_firma')
  6.        {
  7.        foreach($div->getElementsByTagName('div') as $div1)
  8.        {
  9.            $style = $div1->getAttribute('style');
  10.            if ($style == 'float:left')
  11.            {
  12.                foreach($div1->getElementsByTagName('table') as $table)
  13.                {
  14.                    foreach($table->getElementsByTagName('tr') as $tr)
  15.                    {
  16.                        foreach($tr->getElementsByTagName('td') as $td)
  17.                        {
  18.                            $opis = $td->nodeValue;
  19.                             $tmp.=$opis;                      
  20.                        }
  21.                      
  22.                    }
  23.                }
  24.        
  25.            }
  26.        }
  27.  
  28.        }
  29.    }
  30. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.