Простой Html Dom Scraping половина страницы - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь очистить этот URL https://nrg91.gr/nrg-airplay-chart/, используя simple-html-dom, но, похоже, он не получает полный исходный код HTML.Этот код:

        include_once('simple_html_dom.php');
        $html = file_get_html('https://nrg91.gr/nrg-airplay-chart');

        echo $html->plaintext;

отображает содержимое до h1, непосредственно перед содержимым, которое я ищу.А из примеров руководства simple-html-dom должны отображаться все ссылки с этого URL:

        foreach($html->find('a') as $e) 
        echo $e->href . '<br>';

, но отображаются только ссылки на главное навигационное меню, а не на основной текст или нижний колонтитул.

Я также пытался использовать prerender.com, чтобы полностью загрузить url перед передачей его в file_get_html, но результат был таким же.Что я делаю неправильно?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Вот мой супер грязный подход к получению данных rank / artist / title / youtube с использованием DOMDocument и SimpleXML.

Идея состоит в том, чтобы найти каждую «строку» данных через xpath //ul[@id="chart_ul"]/li, затемс помощью dom_import_simplexml( $outer )->getNodePath() создайте новый xpath для выбора отдельных элементов, в которых могут быть расположены нужные данные.

$temp = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'nrg-airplay-chart.html';

if( file_exists( $temp ) === false or filemtime( $temp ) < time() - 3600 )
{
  file_put_contents( $temp, $html = file_get_contents('https://nrg91.gr/nrg-airplay-chart/') );
}
else
{
  $html = file_get_contents( $temp );
}

$dom = new DOMDocument();
$dom->loadHTML( $html );
$xml = simplexml_import_dom( $dom );
$array = array();

foreach( $xml->xpath('//ul[@id="chart_ul"]/li') as $index => $set )
{
  $basexpath = dom_import_simplexml( $set )->getNodePath();
  $array[] = array(
    'ranking' => (string) $xml->xpath( $basexpath . '//span[@id="ranking"]' )[0],
    'artist' => (string) $xml->xpath( $basexpath . '//p[@id="artist"]/b' )[0],
    'title' => (string) $xml->xpath( $basexpath . '//p[@id="title"]' )[0],
    'youtube' => (string) $xml->xpath( $basexpath . '//div[@id="media"]/a/@href' )[0],
  );
}

print_r( $array );
0 голосов
/ 02 октября 2018

Другой подход, который вы, возможно, захотите выполнить:

<?php
    function get_content($url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_exec($ch);
        $htmlContent = curl_exec($ch);
        curl_close($ch);
        return $htmlContent;
    }
    $link = "https://nrg91.gr/nrg-airplay-chart/"; 
    $xml = get_content($link);

    $dom = @DOMDocument::loadHTML($xml);
    $xpath = new DOMXPath($dom);
    foreach($xpath->query('//li[contains(@id,"wprs_chart-")]') as $items){
        $artist = $xpath->query('.//p[@id="artist"]/b',$items)->item(0)->nodeValue;
        $title = $xpath->query('.//p[@id="title"]',$items)->item(0)->nodeValue;
        echo "{$artist} -- {$title}<br>";
    }
?>

Вывод, который вы должны получить как:

PORTOGAL THE MAN -- Feel It Still
JAX JONEW Feat INA WROLDSEN -- Breathe
CAMILA CABELLO -- Havana
CARBI B, J BALVIN & BAD BUNNY -- I Like It
ZAYN Feat SIA -- Dusk Till Dawn
0 голосов
/ 02 октября 2018

Похоже, эта библиотека не обновлялась 7 лет.Я бы всегда рекомендовал использовать встроенные функции PHP :

$url = "https://nrg91.gr/nrg-airplay-chart/";
$dom = new DomDocument();
libxml_use_internal_errors(true);
$dom->load($url);
foreach($dom->getElementsByTagName("a") as $e) {
    echo $e->getAttribute("href") . "\n";
}
...