2012-03-27 5 views
1

Ich verwende einen Crawler, um den HTML-Inhalt bestimmter Seiten im Internet abzurufen. Im Moment habe ich den gesamten HTML-Code in einer einzigen PHP-Variablen gespeichert:Wie extrahiert man nur bestimmte Tags aus einem HTML-Dokument mit PHP?

$string = "<PRE>".htmlspecialchars($crawler->results)."</PRE>\n"; 

Was ich tun möchte, ist wählen Sie alle „p“ Tags (zum Beispiel) und speichern ihre in einem Array. Was ist der richtige Weg, das zu tun?

Ich habe Folgendes versucht, mit Xpath, aber es zeigt nichts (wahrscheinlich, weil das Dokument selbst ist kein XML, ich kopiere einfach das Beispiel in seiner Dokumentation gegeben).

$xml = new SimpleXMLElement ($string); 

    $result=$xml->xpath('/p'); 
    while(list(, $node)=each($result)){ 
     echo '/p: ' , $node, "\n"; 
    } 

Hoffentlich jemand mit (viel) mehr Erfahrung in PHP wird mir zu helfen in der Lage: D

+1

Dies Ihnen helfen kann: http://simplehtmldom.sourceforge.net/ –

+0

Vielen Dank! Das sieht nach einer wirklich soliden und eleganten Lösung aus. Werde mich sofort darum kümmern! – Eugen

+0

Kein Problem. Obwohl es nicht perfekt ist, scheint es die meiste Zeit zu funktionieren. –

Antwort

1

Check out Einfache HTML Dom. Es greift externe Seiten auf und verarbeitet sie mit ziemlich genauen Details.

http://simplehtmldom.sourceforge.net/

Es kann wie folgt verwendet werden:

// Create DOM from URL or file 
$html = file_get_html('http://www.google.com/'); 

// Find all images 
foreach($html->find('img') as $element) 
    echo $element->src . '<br>'; 
2

I zur Verwendung regexp stimmen. Für Tag p

preg_match_all('/<p>(.*)<\/p>/', '<p>foo</p><p>foo 1</p><p>foo 2</p>', $arr, PREG_PATTERN_ORDER); 
if(is_array($arr)) 
{ 
foreach($arr as $value) 
{ 
    echo $value."</br>"; 
} 
} 
+0

Ich schrieb das gleiche, und ich würde hinzufügen, dass die Verwendung eines XML-Readers zum Lesen von HTML-Dokumenten nicht sicher ist. Nicht die Hälfte des HTML im Internet ist richtig als XML formatiert ... – haltabush

+0

Yeap ... Ich entdecke das, wie wir sprechen. Vielen Dank für Ihre Zeit ... Ich werde Ihre Lösung in Sekundenschnelle versuchen und Sie erreichen. – Eugen

+1

Wenn Sie sich Sorgen um wohlgeformtes HTML machen, lesen Sie die Dokumentation zu DOMDocument. Die Methode loadHTML benötigt keine perfekte Formatierung des HTML-Codes und bietet eine Menge Komfort. – clexmond

3

Versuchen Sie es mit DOMDocument zusammen mit DOMDocument::getElementsByTagName. Der Workflow sollte recht einfach sein. So etwas wie:

$doc = DOMDocument::loadHTML(htmlspecialchars($crawler->results)); 
$pNodes = $doc->getElementsByTagName('p'); 

Welche gibt eine DOMNodeList zurück.