Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobranie elementu h1
Forum PHP.pl > Forum > PHP
Destrudo
Hej,

Próbuję pobrać zawartość nagłówka h1 ze źródła strony i nie bardzo mam pomysł. simpledomparser odpada, bo nie jest w stanie pobrać niektórych stron, w związku z czym, chciałem pobrać to ze źródła:

Pobieranie źródła:
  1. $strona = 'example.com';
  2. $datax = file_get_contents('http://'.$strona.'/');
  3. $zrodlo = htmlspecialchars($datax);


Teraz chciałbym pobrać zawartość znajdującą się w zmiennej $zrodlo, pomiędzy "<h1" a "</h1>" (pewnie trzeba użyć encji). Nie mam pomysłu jak wziąc to, co jest pomiędzy, w dodatku z wyłączeniem "class" bądź "style", jeśli nagłówek ma postać: <h1 class="">test</h1> lub <h1 style="">test</h1> lub <h1 style="" class="">test</h1>
viking
Co to znaczy że nie jest w stanie pobrać stron? Żeby pobierać spoza filesystemu php musi być do tego skonfigurowane.
Destrudo
A w jaki sposób to skonfigurować? Bo np poniższy plik:
  1. <?php
  2.  
  3. include('simple_html_dom.php');
  4.  
  5. $html = file_get_html('https://example.com');
  6.  
  7. //to fetch all hyperlinks from a webpage
  8. $links = array();
  9. foreach($html->find('a') as $a) {
  10. $links[] = $a->href;
  11. }
  12. print_r($links);
  13.  
  14. //to fetch all images from a webpage
  15. $images = array();
  16. foreach($html->find('img') as $img) {
  17. $images[] = $img->src;
  18. }
  19. print_r($images);
  20.  
  21. //to find h1 headers from a webpage
  22. $headlines = array();
  23. foreach($html->find('h1') as $header) {
  24. $headlines[] = $header->plaintext;
  25. }
  26. print_r($headlines);
  27. ?>

pobiera dobrze, a niektórych stron nie pobiera (nie wiem od czego to zależne). W jaki sposób powinienem skonfigurować simpledomparsera, aby pobierał każdą stronę?
kpt_lucek
Bo pewnie niektóre strony są oparte o FW po stronie frontendu.
Destrudo
jest zatem jakaś szansa na pobranie <h1> z każdej strony?

np destrudo.pl ten parser nie chce pobrać
viking
Jedyne h1 na tej stronie to #logo bez treści żadnej.
Destrudo
no ok, tylko że parser nie podaje żadnej wartości - https://destrudo.pl/xx/h1.php (nie chce się w ogóle uruchomić)
viking
Jak masz internal server error i wyłączone błedy na ekranie to co ma podać?
Destrudo
Na stackoverflow znalazłem taki kod:
  1. <?php
  2. include('simple_html_dom.php');
  3. $base = 'https://destrudo.pl';
  4.  
  5. $curl = curl_init();
  6. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  7. curl_setopt($curl, CURLOPT_HEADER, false);
  8. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  9. curl_setopt($curl, CURLOPT_URL, $base);
  10. curl_setopt($curl, CURLOPT_REFERER, $base);
  11. curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
  12. $str = curl_exec($curl);
  13. curl_close($curl);
  14.  
  15. // Create a DOM object
  16. $html_base = new simple_html_dom();
  17. // Load HTML from a string
  18. $html_base->load($str);
  19.  
  20. //get all category links
  21. foreach($html_base->find('a') as $element) {
  22. echo "<pre>";
  23. print_r( $element->href );
  24. echo "</pre>";
  25. }
  26.  
  27. $html_base->clear();
  28. unset($html_base);
  29. ?>


który poprawnie podaje linki, więc jest już jakiś progres. Nie wiem tylko teraz jak go przerobić, aby podawał nagłówki h1
viking
Dokładnie tak samo jak dla a

  1. foreach($html_base->find('h1') as $element) {
  2. echo "<pre>";
  3. print_r( $element->plaintext );
  4. echo "</pre>";
  5. }
Destrudo
Dzięki wielkie, działa, a jeszcze takie pytanie, bo do destrudo pokazało się: "Your access to this site has been limited" - da się to jakoś obejść?
I drugie pytanko mam jeszcze, jak jesteśmy przy nagłówkach. Jak sobie wybiorę wszystkie h1-h6 i poukładam jeden pod drugim, dajmy na to:

h1 = qwe
h2 = qwe
h2 = qwer


itd., da się jakoś sprawdzić, czy każdy wyciągnięty nagłówek jest różny? (czy są unikalne)
ostrylg
Jezeli masz przypisane wszystkie naglowki do zmiennych to mozesz to sprawdzic za pomoca instrukcji if, ewentualnie stworzyc tablice i sprawdzic za pomoca funkcji in_array
Destrudo
Własnie nie do końca mam przypisane, bo np do jednej zmiennej mam przypisane wszystkie nagłówki h2 (dajmy na to jest ich 6) z parsera i teraz zastanawiam się, jak sprawdzić w tej zmiennej, czy nagłówki (może ciągli oddzielone <br>? choć tam nie ma br, nie mam pomysłu zbytnio) są unikalne (czy każdy nagłówek z tych 6 nagłówków h2 jest inny, a potem czy każdy nagłówek (wszystkie h2, h3, h4 itd) jest unikalny
ostrylg
To w jaki sposob przypisujesz naglowki np. H2 do zmiennej i jak pozniej sprawdzasz jej zawartosc?
Destrudo
W taki sposób:
  1. foreach($html_base->find('h1') as $element) {
  2. echo "<pre>";
  3. $h1 = $element->plaintext;
  4. echo $h1;
  5. echo "</pre>";
  6. }


Choć martwią mnie limity tego parsera
viking
jakie limity? Możesz przecież find('h1, h2, h3...')..
ostrylg
Zrob sobie tablice z tymi naglowkami:

  1. $array = [];
  2.  
  3. foreach($html_base->find('h1') as $element) {
  4. array_push($array, $element->plaintext);
  5. }


Pozniej uzyj array_unique jezeli nie chcesz miec takich samych naglowkow na stronie
Destrudo
W taki sposób?
  1. $array = [];
  2.  
  3. foreach($html_base->find('h1,h2,h3,h4,h5,h6') as $element) {
  4. array_push($array, $element->plaintext);
  5. $result = array_unique($array);
  6. print_r($result);
  7. }


Jak teraz wyświetlić informację, czy nagłówki są unikalne, czy też powtarzają się?

A co do pytania o limity, to chodziło mi o limity na stronę, bo dostałem taki komunikat: "Your access to this site has been limited", choć możliwe że to limit przez spamowanie tej samej domeny i jest on chwilowy?
ostrylg
Moze po prostu napisz co chcesz konkretnie osiagnac z tymi naglowkami, w jaki sposob chcesz je wysiwetlac, grupowac etc.

Co do limitow to limit serwera dla ilosci zapytan.
Destrudo
Chciałbym sprawdzic i wyechowac informacje, czy naglowki są unikalne, przykład:
pobieram naggłówki:

h1 = ttt
h2 = ewew
h3 = q, reqwe, q, ttt

I w tym przykładzie nagłówki nie są unikalne, bo w h3 występują 2 takie same nagłówki ("q") i nagłówek h1 jest taki sam jak jeden z nagłówków h3 ("ttt")

I jeszcze co do limitów: https://destrudo.pl/xx/h11.php - jest wpisana strona destrudo.pl, a jeśli wpiszę jakąś inną stronę w ten kod, to działa, więc nie wiem jak rozumieć te limity i jak je zwiększyć
ostrylg
Bo to dotyczy serwera ktory jest odpytywany, po drugie kazdy serwer ma inne limity.

  1. $withoutDuplicates = array_unique($array));
  2. $duplicates = array_diff($array, $withoutDuplicates);
  3. print_r($duplicates);


Uzyj tego aby zostawic tylko zduplikowane naglowki.

Destrudo
ok, dzięki wielkie, wtedy tylko wystarczy poniższy if?:
  1. if($duplicates == NULL){echo'nagłówki są unikalne';}else{echo'nie są';}


Btw, co do tego kodu, gdzieś jest błąd, bo nie wyświetla strony:
  1. foreach($html_base->find('h1,h2,h3,h4,h5,h6') as $element) {
  2. $withoutDuplicates = array_unique($array));
  3. $duplicates = array_diff($array, $withoutDuplicates);
  4. print_r($duplicates);
  5. }
ostrylg
Jest jeden nawias za duzo. Wlacz sobie raportowanie bledow bedzie latwiej smile.gif
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.