2012-12-05 23 views
9

Attualmente sto cercando di analizzare alcuni dati da un forum. Ecco il codice:Utilizzo di Xpath con PHP per analizzare 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/>"; 
} 

In ogni caso, il problema è che sto usando google di estensione XPath per aiutarmi a ottenere il percorso, e sto cercando di indovinare che Google sta cambiando il html sufficiente a rendere non venire quando uso il mio sito Web per fare questa ricerca. C'è un modo per far sì che l'host guardi il sito attraverso google chrome in modo che ottenga il codice giusto? Che cosa suggeriresti?

Grazie!

+1

Hai provato a disabilitare Javascript nel tuo browser? Il tuo PHP non lo userà, quindi qualsiasi cambiamento fatto da javascript sul sito web non sarà lì sul server. –

+0

XPath è per XML, non per HTML. – GolezTrol

+1

JS non viene eseguito nella pagina. Sto eseguendo questo. Capisco che XPath è per XML, ma da quello che ho visto attraverso le ricerche di Google, è popolare anche per l'HTML. – VixenSoul

risposta

3

Un doppio '/' eseguirà la ricerca xpath. Quindi, se dovessi usare xpath '// table', avresti tutte le tabelle. Puoi anche usare questo più profondo nella tua struttura xpath come 'html/body/div/div/form // table' per ottenere tutte le tabelle sotto xpath 'html/body/div/div/form'.

In questo modo è possibile rendere il codice un po 'più resiliente rispetto alle modifiche apportate alla sorgente html.

Suggerisco di imparare un po 'su xpath se si desidera utilizzarlo. Copia incolla ti porta solo lontano.

Una semplice spiegazione sulla sintassi può essere trovato alla http://www.w3schools.com/xpath/xpath_syntax.asp

36

Il mio suggerimento è di usare sempre DOMDocument al contrario di SimpleXML, dal momento che è un'interfaccia molto più bello con cui lavorare e rende compiti molto più intuitivo.

L'esempio seguente mostra come caricare l'HTML nell'oggetto DOMDocument e interrogare il DOM utilizzando XPath. Tutto ciò che dovete fare è trovare tutte td elementi con un nome di classe di topicViews e questa uscita volontà ciascuno dei nodeValue membri trovato nella DOMNodeList restituito da questa query 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"; 
} 
Problemi correlati