Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: DOMDoc || curl - polskie znaki
Forum PHP.pl > Forum > PHP
Czizes
Witam,

Mam problem z polskimi znakami (kodowaniem do utf-8) przy używaniu curl'a i domdocument'a przy parsowaniu innej strony. Próbowałem już wielu rozwiązań, m.in. php scraper'a z php.net, podmianą funkcjami kodujacymi itp. Gdy wyświetlam ściągnięte dane poprzez mb_detect_encoding(), część stringów jest faktycznie w utf-8, a część w ASCII. Męczę się już dłuższy czas, dlatego postanowiłem zaciągnąć rady u Was. Poniżej podaję kod (jest to ostatnia wersja z częścią próby poradzenia sobie z problem zaciągniętym na php.net, pominę ten moment):

  1. $ch= curl_init();
  2. curl_setopt ($ch, CURLOPT_URL, $url );
  3. curl_setopt($ch, CURLOPT_HEADER, 0);
  4. curl_setopt($ch,CURLOPT_VERBOSE,1);
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  6. curl_setopt($ch,CURLOPT_POST,0);
  7. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 20);
  8.  
  9. $html= curl_exec($ch);
  10. $html1= curl_getinfo($ch);
  11. /*tutaj część odpowiadająca za podmianę meta http-eqiv*/
  12.  
  13. $dom = new DOMDocument() or die( 'Błąd ładowania DOMdocumentu' );
  14. $dom->preserveWhiteSpace = false;
  15. $page = @$dom->loadHTML($html) or die ( 'Błąd ładowania linka' );
  16. if ( !$page ) { exit( 'Koniec przeszukiwania' ); }
  17.  
  18. #pobieram wszystkie linki z odpowiednią klasą
  19. $elements = $dom->getElementsByTagName('a');
  20.  
  21. if (!is_null($elements)) {
  22. foreach ($elements as $element) {
  23.  
  24. if ( !is_null($element->getAttribute('href') )){
  25. if ( !is_null( $element->getAttribute( 'class' )) && $element->getAttribute( 'class' ) == 'fn openPreview' ){
  26. $all[] = $element->getAttribute('href');
  27. }
  28. }
  29. }
  30.  
  31. for ( $i = 0; $i <= count( $all ) - 1; $i++ ){
  32. #kolejna próba zmiany kodowania
  33. $html=preg_replace('/<head[^>]*>/','<head>
  34. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">', $all[$i]);
  35.  
  36. @$dom->loadHTMLFile( $html );
  37. $xpath = new DOMXpath( $dom );
  38. [...]
  39. }
  40.  
  41. #i dalej wyciąganie danych z kolejnych linków


Za wszelkie podpowiedzi serdecznie dziękuje. Jeżeli czegoś brakuje w powyższym kodzie, chętnie ponownie dodam brakujące elementy.
Pozdrawiam.
zegarek84
Cytat
$html=preg_replace('/<head[^>]*>/','<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">', $all[$i]);

wszystko ładnie i pięknie (ta kolejna próba zmiany kodowania ;p) ale Ty to robisz nie na źródle a na linkach wyciągniętych ze źródła ;p ];->

kiedyś (dawniej jak grałem w plemiona) miałem podobny problem - i rozwiązaniem było wstawienie meta bezpośrednio na początku <head>... (ale i wyrażenia regularne tutaj też są nad wyraz)... poza tym o ile mi wiadomo przy nowszej wersji php DOM domyślnie źródło traktuje kodowaniem utf-8

Cytat
$html=preg_replace('/<head[^>]*>/','<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">', $all[$i]);
@$dom->loadHTMLFile( $html );

pomińmy wyrażenie regularne... ale w tym momencie pytanie - korzystasz z tego curl'a czy nie i masz url_open na true ustawiony (jakoś tak się to zwie - trochum wstawiony ;p)... dokładniej to w zmiennej $html tutaj masz adres internetowy ("pełny" z http/www lub nie - jeśli pełny to zapewne bez problemu otwiera daną stronę bez curl'a - ale i bez ciasteczek i plusów związanych z curl'em lub innych tego typu bibliotek)...

w pętli wcześniejszej do tablicy all zapisywałeś wartości atrybutów href...

pobierając nowy dokument (bez udziału curl'a) jeśli brakowało tego meta to go nie wstawiałeś (a jeśli było to w niektórych przypadkach nie wystarczało, że jest i nie jest definiowane w pierwszej kolejności w head...) - w każdym bądź razie wykrycie wartości i innych rzeczy do końca head nie stanowi najmniejszego problemu gdyż tam nie ma znaków specjalnych...

ps. nie wyciszaj błędów - po to one są by coś sygnalizować - zwłaszcza, że szukasz choćby teraz błędów...
Czizes
Dzięki za odpowiedź. Zaraz usiąde i pokombinuje na nowo.
To jest już chyba 5ta wersja podejścia do tego problemu i tak to teraz wygląda. Zauważyłem na wielu forach (nie tylko polskich), że sporo osób ma takie same problemy, z którymi sobie radzą najczęściej przy użyciu iconv (co u mnie nie zadziałało). U mnie przy ściąganiu tej zewnętrznej strony część wyciągniętych znaków jest kodowana w ASCII, a mniejsza część normalnie w UTF-8 (które i tak posiadają krzaki). Dziwne.

Dodatkowo się zastanawiałem czy istnieje również możliwość, że winą za takie "krzaczki" można obarczyć na przykład jakiś pośredniczący system operacyjny bądź jeszcze co innego?


CuteOne
Dawno się curlem nie bawiłem i mogę się mylić ale po pobraniu strony sprawdź jej kodowanie [$charset = preg_replace()] i wstaw to:

  1.  
  2. $charset = preg_replace(//wstaw tu regexp, żeby dało się wyciągnąc "charset=utf-8", $page);
  3. header('Content-type: text/html; charset='.$charset);
  4.  
  5. @$dom->loadHTMLFile( $html );
  6. $xpath = new DOMXpath( $dom );
  7. [...]
  8. }
  9.  


Nie jestem pewien ale zapis strony w odpowiednim kodowaniu również wpływa na wyświetlanie "krzaczków"
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.