Destrudo
24.01.2017, 09:38:42
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:
$strona = 'example.com';
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
24.01.2017, 10:03:00
Co to znaczy że nie jest w stanie pobrać stron? Żeby pobierać spoza filesystemu php musi być do tego skonfigurowane.
Destrudo
24.01.2017, 10:09:24
A w jaki sposób to skonfigurować? Bo np poniższy plik:
<?php
include('simple_html_dom.php');
$html = file_get_html('https://example.com');
//to fetch all hyperlinks from a webpage
foreach($html->find('a') as $a) {
$links[] = $a->href;
}
//to fetch all images from a webpage
foreach($html->find('img') as $img) {
$images[] = $img->src;
}
//to find h1 headers from a webpage
foreach($html->find('h1') as $header) {
$headlines[] = $header->plaintext;
}
?>
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
24.01.2017, 10:12:03
Bo pewnie niektóre strony są oparte o FW po stronie frontendu.
Destrudo
24.01.2017, 10:19:35
jest zatem jakaś szansa na pobranie <h1> z każdej strony?
np destrudo.pl ten parser nie chce pobrać
viking
24.01.2017, 10:22:50
Jedyne h1 na tej stronie to #logo bez treści żadnej.
Destrudo
24.01.2017, 10:26:21
no ok, tylko że parser nie podaje żadnej wartości -
https://destrudo.pl/xx/h1.php (nie chce się w ogóle uruchomić)
viking
24.01.2017, 10:34:16
Jak masz internal server error i wyłączone błedy na ekranie to co ma podać?
Destrudo
24.01.2017, 10:45:52
Na stackoverflow znalazłem taki kod:
<?php
include('simple_html_dom.php');
$base = 'https://destrudo.pl';
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_URL, $base);
curl_setopt($curl, CURLOPT_REFERER, $base);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$str = curl_exec($curl);
curl_close($curl);
// Create a DOM object
$html_base = new simple_html_dom();
// Load HTML from a string
$html_base->load($str);
//get all category links
foreach($html_base->find('a') as $element) {
}
$html_base->clear();
?>
który poprawnie podaje linki, więc jest już jakiś progres. Nie wiem tylko teraz jak go przerobić, aby podawał nagłówki h1
viking
24.01.2017, 10:53:11
Dokładnie tak samo jak dla a
foreach($html_base->find('h1') as $element) {
}
Destrudo
24.01.2017, 11:04:33
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
24.01.2017, 11:16:58
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
24.01.2017, 11:35:43
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
24.01.2017, 12:06:24
To w jaki sposob przypisujesz naglowki np. H2 do zmiennej i jak pozniej sprawdzasz jej zawartosc?
Destrudo
24.01.2017, 12:11:11
W taki sposób:
foreach($html_base->find('h1') as $element) {
$h1 = $element->plaintext;
}
Choć martwią mnie limity tego parsera
viking
24.01.2017, 12:16:17
jakie limity? Możesz przecież find('h1, h2, h3...')..
ostrylg
24.01.2017, 12:17:09
Zrob sobie tablice z tymi naglowkami:
$array = [];
foreach($html_base->find('h1') as $element) {
}
Pozniej uzyj array_unique jezeli nie chcesz miec takich samych naglowkow na stronie
Destrudo
24.01.2017, 12:29:29
W taki sposób?
$array = [];
foreach($html_base->find('h1,h2,h3,h4,h5,h6') as $element) {
}
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
24.01.2017, 12:34:46
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
24.01.2017, 12:40:47
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
24.01.2017, 12:43:17
Bo to dotyczy serwera ktory jest odpytywany, po drugie kazdy serwer ma inne limity.
$duplicates = array_diff($array, $withoutDuplicates);
Uzyj tego aby zostawic tylko zduplikowane naglowki.
Destrudo
24.01.2017, 12:48:26
ok, dzięki wielkie, wtedy tylko wystarczy poniższy if?:
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:
foreach($html_base->find('h1,h2,h3,h4,h5,h6') as $element) {
$duplicates = array_diff($array, $withoutDuplicates); }
ostrylg
24.01.2017, 12:52:14
Jest jeden nawias za duzo. Wlacz sobie raportowanie bledow bedzie latwiej
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.