Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pobranie tabeli (danych) z innej strony
Forum PHP.pl > Forum > Przedszkole
kubax33
Potrzebuję pobrać dane ze strony kuriera DPD a mianowicie chodzi mi o tabelę statusu przesyłki:
http://www.dpd.com.pl/tracking.asp?przycis...=0000000870377S

  1. $file = file_get_contents("http://www.dpd.com.pl/tracking.asp?przycisk=Wyszukaj&p1=0000000870377S");
  2. preg_match('#<table border="0" cellpadding="0" cellspacing="0" class="subpage_modules">(.+?)</table><br>#', $file, $operator);
  3. echo $operator[1];
  4.  
  5.  


Niestety kod nie działa poprawnie. Czy ktoś może mnie naprowadzić jak to zrobić poprawnie?

athei
  1. preg_match('#<table border="0" cellpadding="0" cellspacing="0" class="subpage_modules">(.+?)<\/table><br>#s', $file, $operator);
didoFREE
Nie chcę zakładać nowego tematu więc podłączę się pod ten... Mam tabele na pewnej stronie z której chce wyciągnąć dane (między znacznikami <td> ) i zapisać je do bazy.


Tabela wygląda tak:
  1. <div id="detail_prod" class="wyslik">
  2. <h1>igl09273 </h1>
  3.  
  4. .......................
  5.  
  6.  
  7. <table cellspacing="0" class="common small">
  8. <tr>
  9. <th>Rodzaj produktu</th>
  10. <td> iglica </td>
  11. <th>waga</th>
  12. <td> 4 </td>
  13. </tr> <tr>
  14. <th>Rozmiar (mm)</th>
  15. <td>198 x 1</td>
  16. <th>szt./ opak</th>
  17. <td>4</td>
  18. </tr> <tr>
  19. <th>Kolor</th>
  20. <td>biały</td>
  21. <th>&nbsp;</th>
  22. <td>&nbsp;</td>
  23. </tr>
  24.  
  25. </tbody>
  26. </table>



I teraz tak rozumie że muszę pobrać dane ze strony i wrzucić dane do tabeli czyli teraz mój antyskrypt wink.gif

  1. <?php
  2. $s = file_get_contents( 'http://jakasdomena/produkt1/igl09273.html' );
  3. preg_match_all( '#<td>(.*?)</td>#is', $s, $m, PREG_SET_ORDER );
  4. print_r( $m ) ;
  5.  
  6. ?>



Chciałbym osiągnąć taki wynik w bazie danych MYSQL:
  1. ID nazwa_prod rodzaj_prod waga rozmiar pakowanie kolor
  2. 1 igl09273 iglica 4 198x1 4 biały
  3. 2 igl09287 iglica 8 220x1 2 biały
  4. 3 iwxl0jdk8 wiertło 2 10x0,5 10 srebny
  5. 4 iiwerwdk8 wiertło 3 10x0,5 10 srebny
  6.  
  7.  
  8.  

rossecki
No kod spoko.
Tylko tym tego do bazy nie zapiszesz tongue.gif
didoFREE
Nie to ja wiem że go do bazy nie zapisze tylko chodzi mi czy dobra koncepcje przyjąłem z tym preg_match_all() questionmark.gifwink.gif
Ja dopiero raczkuje i tylko troche znam sie na php i wiem jaki wynik chce osiągnąć i szukam odpowiednich funkcji do tego wink.gif
didoFREE
Jednak baza mnie przeraża na razie udało mi się z nią połączyć ale za dużo opcji wink.gif Więc postanowiłem zapisać wynik do pliku i znowu problem wink.gif

Chcę pobrać dane między <td> i zapisać każdy jeden do osobnego wiersza w pliku

  1. <?php
  2. $s = file_get_contents( 'http://pyjter.host.sk/przyklad.html' );
  3. preg_match_all( '#<td>(.*?)</td>#is', $s, $m, PREG_SET_ORDER );
  4.  
  5. $string = implode("\n",$m);
  6.  
  7. file_put_contents('asd.txt',$string);
  8. ?>


Po wykonaniu tego skryptu dostaję tylko

Array
Array
Array
Array
Array
Array
...


Ktoś podpowie co robię źle questionmark.gif wink.gif
Gość
Zastosowałeś parametr PREG_SET_ORDER, który powoduje, że w wyniku masz tablicę elementów, które pasują do wzorca, $m[0] - pierwszy pasujący zestaw, $m[1] - drugi, itd.
Zamiast tego powinieneś zastosować PREG_PATTERN_ORDER, wtedy w wierszu 5. można zastosować:
  1. $string = implode("\n", $m[1]);
freeDIDO
Super dzięki ładnie mi zapisało do pliku faktycznie że ja nie skapowałem tego argumentu wcześniej PREG_PATTERN_ORDER, no ale cóż ja dopiero raczkuje w temacie php programistą wybitnym nie będę ale chce sobie zrobić dzięki waszej pomocy skrypt w którym będę wiedział co za co odpowiada wink.gif
Ale mam kolejny problem chcę aby mi wycięło znaki spacji tabulacji itd Wyszukałem że odpowiada za to preg_replace
Czyli załużmy chcę usunąć znaki tabulacji z wyciągniętych haseł z tabeli:

  1. $m = preg_replace("%\t%", "", $m);


Czy takie wyrażenie jest poprawne dla mojego "mega" kodu?? I gdzie mam go umieścićquestionmark.gif Od razu powiem że jest to trochę nielogiczne dla mnie ale wydaje mi się że przed linią która rozdziela dane z tabeli czyli najpierw obróbka a potem podział.
  1. $string = implode("\n",$m[1]);


No chyba że to winno sie zaiwerać już w preg_match_all w wyrażeniu regularnym by pomijało tabulacje i podwójne spacje

Aktualnie plik wynikowy asd.txt wygląda tak:

Kod
                                                                                    Zapałki
                                                                            
                                                                                                                                  tak
                                                                                                                      
                                    
                                                                                    3 x 3 x 50
                                                                            
                                                                                    5
                                                                            
                                    
                                                                                    0,3 x 0,3
                                                                            
                                                                                    60
                                                                            
                                    
                                                                                                                                  tak
                                                                                                                      
                                                                                    56tyś
                                                                            
                                    
                                                                                    drewniany
                                                                            
                                                                                    1mln
                                                                            
                                    
                                                                                    nieobroboona
                                                                            
                                                                                    0,45
                                                                            
                                    
                                                                                                                W22                                                                            
&nbsp;
                                                                                                                                  tak
                                                                                                                      
&nbsp;
                                                                                    małe odchyłki
                                                                            
&nbsp;
freeDIDO
Zmodyfikowałem trochę skrypt i wyszło mi takie cośbiggrin.gif

  1. <?php
  2. $a = file( './plik.txt' );
  3.  
  4. foreach ($a as $t)
  5. {
  6. $s = file_get_contents( $t );
  7. preg_match_all( '#<td>(.*?)</td>#is', $s, $b, PREG_PATTERN_ORDER );
  8.  
  9. $string = implode(";", $b[1]);
  10. }
  11.  
  12.  
  13. file_put_contents('asd.txt',$string);
  14. ?>


w plik.txt mam zapisane 1 adres url = 1 wiersz

Jednak tylko z ostatniego url'a wczytuje mi prawidłowo dane

Przy dwóch piwerwszych wyrzuca mi błąd:
Kod

Warning: file_get_contents(http://www.jakisadres.pl/produkt/eadad/3324.html) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/jail/.../public_html/tabela3.php on line 6

Warning: file_get_contents(http://www.jakisadres.pl/produkt/esad/344.html ) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/jail/.../public_html/tabela3.php on line 6
brzanek
Nie chce zakładać nowego tematu bo nie ma takiej potrzeby ale mam problem z zapisaniem danych do bazy mysql
Mój kod wygląda tak.
  1. <?php
  2. $strona = file_get_contents('adres_www');
  3. echo '<pre>';
  4. preg_match_all( '#<font color=red>(.*?)<\/font>#is', $strona, $wynik, PREG_PATTERN_ORDER );
  5. print_r ($wynik[0]);
  6. $string = implode("\n", $wynik[1]);
  7. file_put_contents('asdd.txt',$string);
  8. include ("db.php");
  9. {
  10. $add = mysql_query("INSERT INTO gryfino (id, tekst, tekst1, takst2, tekst3, tekst4, tekst5) VALUES ('', '$wynik[0]', '$wynik[1]', '$wynik[2]', '$wynik[3]', '$wynik[4]', '$wynik[5]')");
  11. }
  12. ?>

Po wywołaniu pliku php w odpowiedzi dostaję taki zapis.
Array
(
[0] => 8.9
[1] => 8.9
[2] => 9.4
[3] => 9.2
[4] => 11.8
[5] => 7.5
)
Do bazy danych nic nie zostaje dodane.
viking
http://php.net/manual/en/function.mysql-error.php
Usuń kolumnę id bo i tak nic nie dodajesz.
brzanek
Troszkę zmieniłem zapytanie ale i tak nie działa
  1. {
  2. $add = mysql_query("INSERT INTO gryfino (tekst, tekst1, takst2, tekst3, tekst4, tekst5) VALUES ('', '".$wynik[0]."', '".$wynik[1]."', '".$wynik[2]."', '".$wynik[3]."', '".$wynik[4]."', '".$wynik[5]."')");
  3. }
viking
6 kolumn, 7 wartości. Dlaczego nie wyświetlasz błędu?
brzanek
Dodałem błędy
  1. {
  2. $add = mysql_query("INSERT INTO gryfino (tekst, tekst1, takst2, tekst3, tekst4, tekst5) VALUES ('$wynik[0]', '$wynik[1]', '$wynik[2]', '$wynik[3]', '$wynik[4]', '$wynik[5]')");
  3. }

Po wywołaniu pliku mam błąd że zapytanie było puste
viking
No bo było puste. Robisz teraz 2 zapytania a $add zawiera true/false. Nie tutaj ten or.
brzanek
viking już teraz nic nie rozumiem.
Jakie dwa zapytania?
Nie tutaj ten or. ?
viking
2 x wykonujesz zapytania - mysql_query wykonuje zapytanie, tak?
Pierwsze zawiera jakiś błąd zatem $add = false;
Potem robisz
mysql_query(false) or die(mysql_error());
Więc drugie jest puste.

Cytat
This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include:

mysqli_error()
PDO::errorInfo()
brzanek
Dobra trochę zmodyfikowałem cały kod
  1. <?php
  2. $strona = file_get_contents('strona_www');
  3. preg_match_all( '#<font color=red>(.*?)<\/font>#is', $strona, $wynik, PREG_PATTERN_ORDER );
  4. $fn = date("Y-m-d H:i:s");
  5. echo '<pre>';
  6. print_r ($wynik[0]);
  7. echo '</pre>';
  8. $string = implode("\n", $wynik[1]);
  9. file_put_contents('asdd.txt',$string);
  10. include ("db.php");
  11. {
  12. $add = mysql_query("INSERT INTO gryfino (id, data, tekst, tekst1, tekst2, tekst3, tekst4, tekst5) VALUES ('', '$fn', '$string', '', '', '', '', '')");
  13. }
  14. ?>

Zapisuje się do bazy nowy rekord, data i w pierwszej kolumnie wszystkie dane z tablicy a ja chcę aby dane trafiały do odpowiednich pól.
Zrobiłem jedno zapytanie mysql_query które działa ale nie do końca tak jak powinno.
viking
No dobrze ale dlaczego nie wyświetliłeś błędu wcześniej? Skoro wkładasz do `tekst` string będący złączeniem danych z tablicy a do reszty puste stringi to czego się spodziewasz? $wynik jest tablicą wielowymiarową i w tym mógl być problem.
brzanek
No tak i w tym jest problem. A więc jak tą tablicę wielowymiarową zapisać do bazy danych mysql?
viking
A jak się odczytuje tablicę wielowymiarową?
$tab[0][1], $tab[1][10] Tam pewnie nie było indeksu $wynik[5]
brzanek
Gotowy kod
  1. <?php
  2. $strona = file_get_contents('strona_www');
  3. preg_match_all( '#<font color=red>(.*?)<\/font>#is', $strona, $wynik, PREG_PATTERN_ORDER );
  4. $fn = date("Y-m-d H:i:s");
  5. echo '<pre>';
  6. print_r ($wynik[0]);
  7. $tekst = ($wynik[1][0]);
  8. $tekst1 = ($wynik[1][1]);
  9. $tekst2 = ($wynik[1][2]);
  10. $tekst3 = ($wynik[1][3]);
  11. $tekst4 = ($wynik[1][4]);
  12. $tekst5 = ($wynik[1][5]);
  13. echo '</pre>';
  14. include ("db.php");
  15. {
  16. $add = mysql_query("INSERT INTO gryfino (id, fn, tekst, tekst1, tekst2, tekst3, tekst4, tekst5) VALUES ('', '$fn', '$tekst', '$tekst1', '$tekst2', '$tekst3', '$tekst4', '$tekst5')");
  17. }
  18. ?>
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.