Функция PHP для захвата всех ссылок внутри ‹DIV› на удаленном сайте с использованием метода очистки

У кого-нибудь есть функция PHP, которая может захватывать все ссылки внутри определенного DIV на удаленном сайте? Таким образом, использование может быть:

$links = grab_links($url,$divname);

И вернуть массив, который я могу использовать. Захват ссылок я могу понять, но не уверен, как сделать это только в определенном div.

Спасибо! Скотт


person Scott Yu - builds stuff    schedule 29.10.2010    source источник
comment
Не используйте регулярное выражение для анализа HTML, вместо этого используйте парсер HTML dom   -  person Pedro Lobito    schedule 18.08.2011


Ответы (3)


Проверьте PHP XPath. Это позволит вам запрашивать в документе содержимое определенных тегов и так далее. Пример на сайте php довольно прост: http://php.net/manual/en/simplexmlelement.xpath.php

В следующем примере фактически будут получены все URL-адреса в любых DIV в документе:

$xml = new SimpleXMLElement($docAsString);

$result = $xml->xpath('//div//a');

Вы можете использовать это в правильно сформированных HTML-файлах, а не только в XML.

Хороший справочник XPath: http://msdn.microsoft.com/en-us/library/ms256086.aspx

person Matt Crinklaw-Vogt    schedule 29.10.2010

В прошлом я успешно использовал библиотеку PHP Simple DOM:

http://simplehtmldom.sourceforge.net/

Образцы:

// 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>';

// Find all links 
foreach($html->find('a') as $element) 
       echo $element->href . '<br>';
person Emil Orol    schedule 29.10.2010

Я нашел то, что, кажется, делает то, что я хотел.

http://www.earthinfo.org/xpaths-with-php-by-example/

<?php

$html = new DOMDocument();
@$html->loadHtmlFile('http://www.bbc.com');
$xpath = new DOMXPath( $html );
$nodelist = $xpath->query( "//div[@id='news_moreTopStories']//a/@href" );
foreach ($nodelist as $n){
echo $n->nodeValue."\n";
}

// for images

echo "<br><br>";
$html = new DOMDocument();
@$html->loadHtmlFile('http://www.bbc.com');
$xpath = new DOMXPath( $html );
$nodelist = $xpath->query( "//div[@id='promo_area']//img/@src" );
foreach ($nodelist as $n){
echo $n->nodeValue."\n";
}

?>

Я также попробовал метод PHP DOM, и он кажется быстрее...

http://w-shadow.com/blog/2009/10/20/how-to-extract-html-tags-and-their-attributes-with-php/

$html = file_get_contents('http://www.bbc.com');
//Create a new DOM document
$dom = new DOMDocument;

//Parse the HTML. The @ is used to suppress any parsing errors
//that will be thrown if the $html string isn't valid XHTML.
@$dom->loadHTML($html);

//Get all links. You could also use any other tag name here,
//like 'img' or 'table', to extract other tags.
$links = $dom->getElementById('news_moreTopStories')->getElementsByTagName('a');

//Iterate over the extracted links and display their URLs
foreach ($links as $link){
    //Extract and show the "href" attribute. 
    echo $link->getAttribute('href'), '<br>';
}
person Scott Yu - builds stuff    schedule 29.10.2010
comment
Я заметил, что это немного медленнее, чем использование PHP DOM. - person Scott Yu - builds stuff; 29.10.2010
comment
правда, xpath немного медленный. Парсинг исключительно с помощью регулярных выражений, вероятно, был бы одним из самых быстрых действий, которые вы могли бы сделать. - person Matt Crinklaw-Vogt; 29.10.2010