Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> DOMDoc || curl - polskie znaki
Czizes
post 5.10.2010, 14:44:19
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 12.04.2010

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


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.
Go to the top of the page
+Quote Post
zegarek84
post 5.10.2010, 18:30:54
Post #2





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


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...

Ten post edytował zegarek84 5.10.2010, 18:33:25


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
Czizes
post 6.10.2010, 07:31:06
Post #3





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 12.04.2010

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


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?


Go to the top of the page
+Quote Post
CuteOne
post 6.10.2010, 13:29:48
Post #4





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


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"
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: 14.08.2025 - 09:12