Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pobieranie konkretnej informacji z tabeli na innej stronie.
omi
post 7.02.2018, 01:55:53
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.11.2017

Ostrzeżenie: (0%)
-----


Witam!

Pobieram całą stronę: https://secure.tibia.com/community/?subtopic=killstatistics (np.server Amera ) do pliku tekstowego za pomocą curl, a chcałbym z tej tabeli co tam jest zapisać tylko np. dwie pozycje "Abyssador" i "An Observer Eye" z kolumny Race, a z kolumny Last Day - Killed by Players.

Bym prosił o jakiś przykładowy kod jak to wyselekcjonować żeby nie zapisywało wszystkiego ze strony tylko te konkretne dwie rzeczy. Pozdrawiam.

Ten post edytował omi 7.02.2018, 01:57:04
Go to the top of the page
+Quote Post
SmokAnalog
post 7.02.2018, 02:19:53
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Masz szczęście, bo w przypadku tej strony do treści po wysłaniu formularza z nazwą świata możesz też się dostać z metody GET: https://secure.tibia.com/community/?subtopi...amp;world=Amera

Dla Ciebie oznacza to tyle, że nie musisz się bawić w cURL czy inne biblioteki do wykonywania żądań HTTP. Wystarczy zwykłe:

  1. $html = file_get_contents('https://secure.tibia.com/community/?subtopic=killstatistics&world=Amera');


Jak już masz w zmiennej kod HTML, to najlepiej analizować go parserem DOM, np. wbudowanym PHP DOM. To już wymaga trochę wprawy.
Go to the top of the page
+Quote Post
omi
post 7.02.2018, 03:13:35
Post #3





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.11.2017

Ostrzeżenie: (0%)
-----


Dzięki za odpowiedź. Mam taki kod znalazłem z forum. Zapisuję on już nie całą stronę tylko niektóre elementy tabeli. A co by tu zmienić w tym kodzie żeby zapisać tylko np. dwie pozycje "Abyssador" i "An Observer Eye" z kolumny Race, a z kolumny Last Day - Killed by Players znajdującą się tam liczbę? Tak w ogóle to bym chciał to co wybiorę z tabeli zapisać do bazy danych w przyszłości, nie jestem do końca pewny czy dobrze kombinuje teraz czy to się tak da zapisać do bazy danych?


  1. <?php
  2. $s = file_get_contents('https://secure.tibia.com/community/?subtopic=killstatistics&world=Amera');
  3. preg_match_all( '#<td>(.*?)</td>#is', $s, $m, PREG_PATTERN_ORDER );
  4.  
  5. $string = implode("\n", $m[1]);
  6.  
  7. file_put_contents('asd.txt',$string);
  8. ?>
Go to the top of the page
+Quote Post
viking
post 7.02.2018, 07:16:01
Post #4





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


http://simplehtmldom.sourceforge.net/manual.htm

  1. <?php
  2.  
  3. include 'simple_html_dom.php';
  4.  
  5. $html = new simple_html_dom();
  6. $a = $html->load_file('https://secure.tibia.com/community/?subtopic=killstatistics&world=Amera');
  7. $table = $html->find('div#ContentHelper table', 4);
  8.  
  9. foreach ($table->find('tr td') as $td) {
  10. echo $td->plaintext;
  11. }


Kombinuj dalej.


--------------------
Go to the top of the page
+Quote Post
trueblue
post 7.02.2018, 08:50:34
Post #5





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  1. $html = file_get_contents('https://secure.tibia.com/community/?subtopic=killstatistics&world=Amera');
  2.  
  3. $dom = new DOMDocument;
  4. libxml_use_internal_errors(true);
  5. $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
  6. libxml_clear_errors();
  7. $dom->encoding = 'UTF-8';
  8.  
  9. $xpath = new DOMXPath($dom);
  10. $tds = $xpath->query('//table//td[contains(text(),"Abyssador") or contains(text(),"An Observer Eye")]/ancestor::tr/td[3]');
  11.  
  12. foreach($tds as $td){
  13. echo $td->nodeValue;
  14. }


Więcej info na: http://kawalekkodu.pl/post/the-tag-is-out-...domxpath-s01e01


--------------------
Go to the top of the page
+Quote Post
omi
post 7.02.2018, 15:54:53
Post #6





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.11.2017

Ostrzeżenie: (0%)
-----


Dziękuję za odpowiedź. To zaczyna nabierać jakiś kształtów.
Go to the top of the page
+Quote Post
SmokAnalog
post 7.02.2018, 18:35:48
Post #7





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


A odpowiadając na Twoją wątpliwość preg_match i preg_match_all też mogą być używane do wyłuskiwania danych z HTML-a, prawdziwe parsery DOM to jednak lepszy sposób. O ile wyrażenia regularne sprawdzą się w bardzo prostych przypadkach, tak już na przykład wybieranie komórki tabeli w czwartej kolumnie może okazać się mało intuicyjnym zadaniem dla wyrażenia regularnego, jeśli komórka nie została oznaczona jakimiś specyficznymi atrybutami. Co gorsza, nawet jeśli Twój wzorzec zostanie dopasowany, teoretycznie może on pasować do czegoś innego, bo akurat jakiś inny element też spełnia wymagania. Lepiej nauczyć się pracować z parserami DOM, bo od tego są.
Go to the top of the page
+Quote Post
omi
post 7.02.2018, 22:24:39
Post #8





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.11.2017

Ostrzeżenie: (0%)
-----


Jeszcze mam jeden dylemat bo przeszukiwałem internet i nic takiego nie mogę znaleźć. Wiem że trzeba dodać do tego kodu:

  1. $html = file_get_contents('https://secure.tibia.com/community/?subtopic=killstatistics&world=Amera');
  2.  
  3. $dom = new DOMDocument;
  4. libxml_use_internal_errors(true);
  5. $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
  6. libxml_clear_errors();
  7. $dom->encoding = 'UTF-8';
  8.  
  9. $xpath = new DOMXPath($dom);
  10. $tds = $xpath->query('//table//td[contains(text(),"Abyssador") or contains(text(),"An Observer Eye")]/ancestor::tr/td[3]');
  11.  
  12. foreach($tds as $td){
  13. echo $td->nodeValue;
  14. }


dane do połączenia z bazą :

$url = 'adres bazy danych np: localhost';
$identyfikator = 'login';
$haslo = 'hasło';
$baza_danych="nazwa_bazy_danych";
$tabela="nazwa_tabeli"

i nie wiem co dalej zmienić w kodzie żeby wynik nie był wyświetlany w przeglądarce tylko został zapisany do bazy danych w jednym wierszu w dwóch kolumnach, wynik 0 w jednej kolumnie wynik 1 w drugiej kolumnie tabeli.
Przy okazji jak będę robił kolejny zapis do bazy danych żeby dało się skasować poprzedni zapis.
Pozdrawiam

Go to the top of the page
+Quote Post
SmokAnalog
post 7.02.2018, 23:15:13
Post #9





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Coś słabo szukasz: http://php.net/manual/en/mysqli.prepare.php i użyj tego do wykonania zapytań INSERT i DELETE.
Go to the top of the page
+Quote Post
omi
post 8.02.2018, 05:28:09
Post #10





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.11.2017

Ostrzeżenie: (0%)
-----


Dzięki za odpowiedź. Popróbuję coś wykombinować tylko mówię od razu że nie skończyłem informatyki na politechnice i mogę nie ogarniać niektórych wątków i nie ogarniam. Coś spróbuję posklejać. To taki projekt hobbistyczny.

INSERT to powinien wyglądać mniej więcej tak ?:

  1. INSERT INTO $tabela VALUES ('0', '1');


I wtedy te pobrane dane można zapisać w jednym wierszu w dwóch kolumnach. Tak tu to widzę z przykładów.
Czyli potrzebuje w kodzie mieć coś takiego jw. czy nie bardzo?


A więc na razie mam taki kod:

  1. $mysqli = new mysqli("localhost", "my_user", "my_password", "nazwa bazy danych");
  2.  
  3. /* check connection */
  4. if (mysqli_connect_errno()) {
  5. printf("Connect failed: %s\n", mysqli_connect_error());
  6. exit();
  7. }
  8.  
  9. $tabela = "Nazwa tabeli";
  10.  
  11.  
  12. $html = file_get_contents('https://secure.tibia.com/community/?subtopic=killstatistics&world=Amera');
  13.  
  14. $dom = new DOMDocument;
  15. libxml_use_internal_errors(true);
  16. $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
  17. libxml_clear_errors();
  18. $dom->encoding = 'UTF-8';
  19.  
  20. $xpath = new DOMXPath($dom);
  21. $tds = $xpath->query('//table//td[contains(text(),"Abyssador") or contains(text(),"An Observer Eye")]/ancestor::tr/td[3]');
  22.  
  23. foreach($tds as $td){
  24. echo $td->nodeValue;
  25. }


I teraz nie wiem jak zmodyfikować ten kod i wstawić do niego INSERT i DELETE.
Pozdrawiam

Po chwili zastanowienia stwierdziłem ze ten kod wyżej nie zda mi egzaminu trzeba to zrobić tak jak pisał SmokAnalog za pomocą preg_match i preg_match_all. Czyli w bazie danych powinny być dwa wiersze w tym przypadku w których będą się znajdować dwa słowa "Abyssador" i "An Observer Eye" i przypisane w drugiej kolumnie do tych słów wartości.

Ten post edytował omi 8.02.2018, 01:27:45
Go to the top of the page
+Quote Post
SmokAnalog
post 8.02.2018, 07:20:37
Post #11





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


To czy użyć PHP DOM czy preg_match_all to tylko kwestia wyłuskania tych danych i lepiej to zrobić z PHP DOM. Co do tego jak zrobić zapytanie, przejrzyj ten link, który Ci wysłałem. Tam masz przykłady.
Go to the top of the page
+Quote Post
omi
post 8.02.2018, 16:30:00
Post #12





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.11.2017

Ostrzeżenie: (0%)
-----


Czy by mógł mi ktoś dokończyć ten kod i dodać do niego INSERT żebym mógł zobaczyć jak to się zapiszę w bazie danych. bo na razie ten kod wyświetla mi wynik w przeglądarce. Bym prosił. Pozdrawiam.



  1. $mysqli = new mysqli("localhost", "my_user", "my_password", "nazwa bazy danych");
  2.  
  3. /* check connection */
  4. if (mysqli_connect_errno()) {
  5. printf("Connect failed: %s\n", mysqli_connect_error());
  6. exit();
  7. }
  8.  
  9. $tabela = "Nazwa tabeli";
  10.  
  11.  
  12. $html = file_get_contents('https://secure.tibia.com/community/?subtopic=killstatistics&world=Amera');
  13.  
  14. $dom = new DOMDocument;
  15. libxml_use_internal_errors(true);
  16. $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
  17. libxml_clear_errors();
  18. $dom->encoding = 'UTF-8';
  19.  
  20. $xpath = new DOMXPath($dom);
  21. $tds = $xpath->query('//table//td[contains(text(),"Abyssador") or contains(text(),"An Observer Eye")]/ancestor::tr/td[3]');
  22.  
  23. foreach($tds as $td){
  24. echo $td->nodeValue;
  25. }
Go to the top of the page
+Quote Post
viking
post 8.02.2018, 17:02:54
Post #13





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Wygląda jakbyś całkowicie czekał na gotowca. Podstaw zapytanie insert zamiast echo i tyle.


--------------------
Go to the top of the page
+Quote Post
omi
post 8.02.2018, 20:46:54
Post #14





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.11.2017

Ostrzeżenie: (0%)
-----


Dzięki za odpowiedz.

Jak na razie dzięki należy się Wam flaszka Piccolo.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 00:26