2011-07-09 12 views
14

Chciałbym pobrać dane ze stołu bez użycia wyrażeń regularnych. Byłem zadowolony z używania simpleksml do analizowania kanałów RSS i chciałbym wiedzieć, czy można go wykorzystać do pobrania tabeli z innej strony.Czy simplexml może być używany do robienia zakupów w html?

Np. Chwyć stronę za pomocą curl lub po prostu file_get_contents(); następnie użyj simplexml do pobrania zawartości?

Odpowiedz

27

Można korzystać z funkcji loadHTML z modułu DOM, a następnie zaimportować że DOM w SimpleXML poprzez simplexml_import_dom:

$html = file_get_contents('http://example.com/'); 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$sxml = simplexml_import_dom($doc); 
+1

Big +1. Dodano link do 'simplexml_import_dom' i odrobinę dalszych wyjaśnień. –

+0

Bardzo ładna sztuczka. Niestety wygląda na to, że moduł DOM nie jest zainstalowany na serwerze, nad którym pracuję. Czy to zazwyczaj standard>? – chris

+0

@chris DOM i jego zależność, libxml, są kompilowane domyślnie. Mogą być wyraźnie pominięte w kompilacji lub wyłączone w czasie wykonywania, ale to bardzo nietypowe. – phihag

7

Jeśli to XHTML - tak, jest to zdecydowanie możliwe. Prawdziwy XHTML to po prostu XML, więc można go przetworzyć za pomocą analizatora XML.

SimpleXML akceptuje tylko ścisły kod XML. Jeśli nie można uzyskać poprawny XHTML wygląda umieszczenie go przez mniej ścisłym DOMDocument biblioteki pierwszy rade (source here):

<?php 
    $html = file_get_contents('http://...'); 
    $doc = new DOMDocument(); 
    $doc->strictErrorChecking = FALSE; 
    $doc->loadHTML($html); 
    $xml = simplexml_import_dom($doc); 
?> 
0

może zależeć na stronie. Jeśli strona jest w XHTML (większość dzisiejszych stron internetowych), to każdy parser XML powinien zrobić, inaczej szukamy parsera SGML. Oto podobne pytanie, może być zainteresowany: Error Tolerant HTML/XML/SGML parsing in PHP

+1

NAJBARDZIEJ strony internetowe? Źródło dla tych danych pls? Ponadto, proszę rozejrzyj się po SO (lub ogólnie w Internecie), aby dowiedzieć się, dlaczego ludzie zwykle nie obsługują XHTML poprawnie. – Mchl

1

Moja wersja - tolerancyjny na błędy i problemy z kodowaniem

libxml_use_internal_errors(true); 
$doc = new DOMDocument(); 
$doc->strictErrorChecking = FALSE; 
$doc->loadHTML(mb_convert_encoding($this->html_content, 'HTML-ENTITIES', 'UTF-8')); 
libxml_use_internal_errors(false); 
$xml = simplexml_import_dom($doc); 
Powiązane problemy