Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [xml][DOM] sama podstawa
marcinek37
post
Post #1





Grupa: Zarejestrowani
Postów: 239
Pomógł: 0
Dołączył: 2.06.2011

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


Mam kod:
  1. <?
  2. $doc = new DOMDocument();
  3. $doc->loadHTML('<HTML><A HREF="ss">asd</A>');
  4. echo $doc;
  5. ?>


Dopóki nie dodam ostatniej linijki, błędu nie ma. Jeśli tylko dowiem się w czym leży problem, od razu będę mógł iść dalej z tematem.

phhpinfo() mówi:
DOM/XML enabled
DOM/XML API Version 20031129
libxml Version 2.6.26
HTML Support enabled
XPath Support enabled
XPointer Support enabled
Schema Support enabled
RelaxNG Support enabled
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
zegarek84
post
Post #2





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

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


nie jestem z zawodu programistą ale dawniej do parsowania gry www właśnie korzystałem z PHP i DOM ^^ - niestety z kodowaniem trzeba wziąć sprawy w swoje ręce... oprócz kodu przeczytaj komentarze w tej funkcji:
DOMDocument::loadHTML
więc plik musiałby albo zawierać na początku dyrektywę kodowania albo trzeba przekonwertować źródło i znaki UTF-8 do encji html... preferuję to drugie podejście...

kodowanie na stronie możesz rozpoznać dwojako, albo z nagłówków odpowiedzi jeśli byś korzystał z CURL'a albo z tagu meta określającego kodowanie... no ale żeby go odczytać to musisz w pierw wczytać dokument jakim jest (chyba, że wolisz bawić się z wyrażeniami regularnymi ale nie polecam) - i to podejście Ci na początku polecam... inne rozwiązanie by zmniejszyć pamięć (choć w sumie nie musisz zwłaszcza w celach ćwiczebnych) to ten tag meta odszukać przez SAX i przerwać przeglądanie dokumentu po znalezieniu kodowania - ale na tym etapie wiedzy jak Ci wspominałem wcześniej nawet tego nie dotykaj ;p

a teraz jak znasz kodowanie strony to możesz zrobić np. w ten sposób:
  1. <?php
  2. error_reporting(E_ALL|E_STRICT);
  3. ini_set('display_errors', '1');
  4.  
  5. $objDOM = new DOMDocument('1.0', 'UTF-8');
  6. $sHTML = mb_convert_encoding(file_get_contents("http://www.onet.pl"),'HTML-ENTITIES', 'UTF-8');
  7. @$objDOM->loadHTML($sHTML);
  8. // echo $objDOM->saveHTML();
  9. echo mb_convert_encoding($objDOM->saveHTML(),'UTF-8' ,'HTML-ENTITIES');

w ostatniej linijce nie musisz konwertować z powrotem, ale podejrzewam, iż nie chcesz encji ;]

a jeśli nie znasz kodowania to na Twój aktualny poziom wiedzy można by np. w ten sposób:
  1. <?php
  2. error_reporting(E_ALL | E_STRICT);
  3. ini_set('display_errors', '1');
  4.  
  5. $objDOM = new DOMDocument('1.0', 'UTF-8');
  6. $sHTML = file_get_contents("http://www.onet.pl");
  7. //$sHTML = file_get_contents("http://localhost/modul_1/public/urzytkownik/zarejestrowani/");
  8. @$objDOM->loadHTML($sHTML);
  9. $oXPath = new DOMXPath($objDOM);
  10. $oMeta = $oXPath->query('//meta[@charset]|//meta[@http-equiv and @content]')->item(0);
  11. $oXPath = NULL;
  12. unset($oXPath);
  13. $sEcode = 'UTF-8';
  14. if ($oMeta) {
  15. if ($oMeta->hasAttribute('charset')) {
  16. $sEcode = $oMeta->getAttribute('charset');
  17. }
  18. if ($oMeta->hasAttribute('content')) {
  19. $aTemp = explode('=', $sEcode = $oMeta->getAttribute('content'), 2);
  20. $sEcode = trim($aTemp[1]);
  21. }
  22. }
  23. $sHTML = mb_convert_encoding($sHTML, 'HTML-ENTITIES', $sEcode);
  24. @$objDOM->loadHTML($sHTML);
  25. // przy następnej linijce uważaj gdyż może Ci rozwalić plik html...
  26. echo mb_convert_encoding($objDOM->saveHTML(), 'UTF-8', 'HTML-ENTITIES');


ps.
przypomniałem sobie i może Cię to zainteresować, a raczej powinieneś się zainteresować jeśli zamierzasz parsować strony
luknij na tą rozwijaną bibliotekę:
https://github.com/html5lib/html5lib-php
info o niej pośrednio ze strony:
http://ejohn.org/blog/pure-javascript-html-parser/

Ten post edytował zegarek84 13.04.2013, 00:13:24
Go to the top of the page
+Quote Post

Posty w temacie
- marcinek37   [xml][DOM] sama podstawa   8.04.2013, 14:15:55
- - nospor   CytatDopóki nie dodam ostatniej linijki, błędu nie...   8.04.2013, 14:20:51
- - marcinek37   kompletnie wypadło mi z głowy, taki jest błąd: Ca...   8.04.2013, 17:03:10
- - melkorm   RTFM http://pl1.php.net/manual/en/domdocument.save...   8.04.2013, 17:14:26
- - marcinek37   czy macie może linka do jakiegoś poradnika, ale w ...   8.04.2013, 17:30:53
- - zegarek84   niestety większość materiałów jest po angielsku......   8.04.2013, 21:24:37
- - marcinek37   zrobiłem postępy w temacie, ale zatrzymałem się na...   8.04.2013, 23:23:09
- - nospor   CytatWszystko jest ok, ale wartości się nie pokazu...   9.04.2013, 06:41:31
- - marcinek37   Po dodaniu tego kodu pokazują się takie błędy: Not...   9.04.2013, 11:24:13
- - zegarek84   [PHP] pobierz, plaintext <?phperror_reporting...   9.04.2013, 20:01:30
- - marcinek37   świetnie, działa! a powiedz mi, "duże...   9.04.2013, 22:49:54
- - zegarek84   to zależy od ustawień serwera... ale każdy plik wc...   9.04.2013, 23:06:59
- - marcinek37   ok, a masz może jakiegoś linka do jakiegoś poradni...   10.04.2013, 00:51:33
- - zegarek84   popisz trochę w JavaScript, korzystaj z narzędzi t...   10.04.2013, 11:48:50
- - marcinek37   1. mam już troszkę rozszerzony kod: [PHP] pobierz,...   10.04.2013, 23:43:23
- - zegarek84   przede wszystkim zawsze wyświetlaj sobie błędy: er...   11.04.2013, 08:56:03
- - marcinek37   bardzo Ci dziękuję! 1. specjalnie w drugim pr...   11.04.2013, 11:11:22
|- - zegarek84   Cytat(marcinek37 @ 11.04.2013, 12:11...   11.04.2013, 12:58:51
- - marcinek37   czyli muszę korzystać z DOMDocument oraz DOMXPath,...   11.04.2013, 15:25:13
- - zegarek84   z PHP tak na szybko to przeczytaj sobie np. to: ht...   11.04.2013, 17:24:50
- - marcinek37   troszkę ciekawych informacji z tego linka wyciągną...   11.04.2013, 23:01:47
|- - zegarek84   Cytat(marcinek37 @ 12.04.2013, 00:01...   11.04.2013, 23:21:19
- - marcinek37   1. wydaje się, że to ta metoda: createElement prze...   12.04.2013, 01:04:14
- - zegarek84   HTML nie zawsze jest poprawnym dokumentem XML ;] -...   12.04.2013, 11:51:23
- - marcinek37   bardzo dziękuję za informacje szkoda tylko, że tr...   12.04.2013, 11:56:27
- - zegarek84   poprawiłem powyższy kod - xpath nie musisz używać ...   12.04.2013, 12:16:14
- - marcinek37   na razie nie chcę korzystać z DOMXPath, a skupić s...   12.04.2013, 15:45:21
- - zegarek84   przecież napisałem Ci wyżej, iż .load służy do wcz...   12.04.2013, 16:46:21
- - marcinek37   przepraszam, źle odczytałem Twoje wskazówki, jest ...   12.04.2013, 17:28:25
- - zegarek84   nie jestem z zawodu programistą ale dawniej do par...   12.04.2013, 21:24:10
- - marcinek37   przepraszam, że odpisuję Ci dopiero teraz, ale cał...   14.04.2013, 23:12:43


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

 



RSS Aktualny czas: 28.12.2025 - 09:07