Używam przeszukiwacza do pobierania zawartości HTML niektórych stron w sieci. Obecnie cały HTML jest przechowywany w jednej zmiennej PHP:
$string = "<PRE>".htmlspecialchars($crawler->results)."</PRE>n";
Chcę wybrać wszystkie znaczniki „p” (na przykład) i zapisać je w tablicy. Jaki jest właściwy sposób na to?
Próbowałem, używając xpath, ale niczego nie pokazuje (najprawdopodobniej dlatego, że sam dokument nie jest XML, po prostu skopiowałem wklejony przykład podany w jego dokumentacji).
$xml = new SimpleXMLElement ($string);
$result=$xml->xpath("/p");
while(list( , $node)=each($result)){
echo "/p: " , $node, "n";
}
Mam nadzieję, że ktoś z (dużo) większym doświadczeniem w PHP będzie w stanie mi pomóc: D
Odpowiedzi:
1 dla odpowiedzi № 1Sprawdź Simple HTML Dom. Będzie pobierać strony zewnętrzne i przetwarzać je z dość dokładnymi szczegółami.
http://simplehtmldom.sourceforge.net/
Może być używany w ten sposób:
// 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>";
3 dla odpowiedzi № 2
Spróbuj użyć DOMDocument wraz z DOMDocument :: getElementsByTagName. Przepływ pracy powinien być dość prosty. Coś jak:
$doc = DOMDocument::loadHTML(htmlspecialchars($crawler->results));
$pNodes = $doc->getElementsByTagName("p");
Który zwróci listę DOMNodeList.
2 dla odpowiedzi nr 3
Głosuję na użycie regexp. Dla tagu 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>";
}
}