2012-12-05 15 views
9

Obecnie próbuję parsować niektóre dane z forum. Oto kod:Używanie Xpath z PHP do parsowania HTML

$xml = simplexml_load_file('https://forums.eveonline.com'); 

$names = $xml->xpath("html/body/div/div/form/div/div/div/div/div[*]/div/div/table//tr/td[@class='topicViews']"); 
foreach($names as $name) 
{ 
    echo $name . "<br/>"; 
} 

W każdym razie, problem jest, że używam google rozszerzenie XPath pomoże mi uzyskać ścieżkę i zgaduję, że Google zmienia html na tyle, aby nie wymyślić kiedy korzystam z mojej strony internetowej, aby wykonać to wyszukiwanie. Czy istnieje sposób, w jaki mogę sprawić, że host przyjrzy się witrynie za pomocą Google Chrome, aby uzyskać właściwy kod? Co byś zasugerował?

Dzięki!

+1

Czy próbowałeś wyłączyć obsługę Javascript w swojej przeglądarce? Twój PHP go nie użyje, stąd żadna zmiana dokonana przez javascript na stronie nie będzie na serwerze. –

+0

XPath jest dla XML, a nie dla HTML. – GolezTrol

+1

JS nie jest uruchamiany na stronie, na której to uruchomiłem. Rozumiem, że XPath jest dla XML, ale z tego, co widziałem przez wyszukiwarki Google, jest również popularny w HTML. – VixenSoul

Odpowiedz

3

Podwójne "/" spowoduje przeszukiwanie xpath. Więc jeśli użyjesz xpath "// table", otrzymasz wszystkie tabele. Możesz również użyć tego głębiej w strukturze xpath, jak "html/body/div/div/form // table", aby uzyskać wszystkie tabele pod ścieżką xpath 'html/body/div/div/form'.

W ten sposób możesz uczynić swój kod nieco bardziej odpornym na zmiany w źródle html.

Proponuję dowiedzieć się trochę o xpath, jeśli chcesz go użyć. Kopiuj wklej tylko dostaje cię do tej pory.

Proste wyjaśnienie o składni można znaleźć na http://www.w3schools.com/xpath/xpath_syntax.asp

36

Moja sugestia jest, aby zawsze używać DOMDocument w przeciwieństwie do SimpleXML, ponieważ jest o wiele ładniejszy interfejs do pracy i sprawia, że ​​zadania o wiele bardziej intuicyjny.

Poniższy przykład ilustruje sposób załadowania kodu HTML do obiektu DOMDocument i przesłania zapytania do DOM przy użyciu XPath. Wszystko, co naprawdę trzeba zrobić, to znaleźć wszystko TD elementy z nazwą klasy topicViews i wyjście to każdego z nodeValue członków znalezionego w DOMNodeList zwróconej przez tego zapytania XPath.

/* Use internal libxml errors -- turn on in production, off for debugging */ 
libxml_use_internal_errors(true); 
/* Createa a new DomDocument object */ 
$dom = new DomDocument; 
/* Load the HTML */ 
$dom->loadHTMLFile("https://forums.eveonline.com"); 
/* Create a new XPath object */ 
$xpath = new DomXPath($dom); 
/* Query all <td> nodes containing specified class name */ 
$nodes = $xpath->query("//td[@class='topicViews']"); 
/* Set HTTP response header to plain text for debugging output */ 
header("Content-type: text/plain"); 
/* Traverse the DOMNodeList object to output each DomNode's nodeValue */ 
foreach ($nodes as $i => $node) { 
    echo "Node($i): ", $node->nodeValue, "\n"; 
} 
Powiązane problemy