Показать пустые элементы в объекте DOMNodeList - PullRequest
0 голосов
/ 05 мая 2018

Мне нужна помощь с моим кодом, так как у меня возникла проблема с разбором элементов из тегов в html-источнике. Когда я пытаюсь это:

 $doc = new DOMDocument();
 $doc->preserveWhiteSpace = false;
 $doc->loadHTML($html);
 $get_time = $doc->getElementById('date-time');

Я получу пустой вывод. Я пытался использовать date и time так:

$get_time = $doc->getElementsByTagName('date');

И

$get_time = $doc->getElementsByTagName('time');

Когда я пытаюсь это сделать, ничего не работает, поскольку я получу возвращаемый результат, подобный этому:

DOMNodeList Object ( [length] => 0 )

Вот HTML-код:

["<a style='width: 149px;' data-time='6:00 am' </a><a style='width: 149px;' data-time='6:30 am' 
</a><a style='width: 149px; data-time='7:00 am' </a><a style='width: 149px; data-time='7:30 am' 
</a><a style='width: 99px; data-time='7:00 am' </a>"]

Вот что я пытаюсь достичь:

6:00 am
6:30 am
7:00 am
7:30 am
8:00 am

Вот полный код:

$url = 'http://example.com/GS?cid=1234'
$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_USERAGENT => '',
    CURLOPT_TIMEOUT => 30,
    CURLOPT_CONNECTTIMEOUT => 30,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_MAXREDIRS => 5,
    CURLOPT_URL => $url,
 ));

 $html = curl_exec($curl);
 curl_close($curl);

 $doc = new DOMDocument();
 $doc->preserveWhiteSpace = false;
 $doc->loadHTML($html);
 $get_time = $doc->getElementsByTagName('date-time');

 foreach($get_timeas $time)
 {
    echo $time;
 }

Я действительно не понимаю, почему он не работал, когда я использую функцию getElementsByTagName, которая должна была работать, но не работала. Можете ли вы показать мне пример того, как я могу проанализировать теги date-time, используя с domdocument?

EDIT:

Это то, что я получаю, когда использую var_dump и print_r:

array(1) { [0]=> string(10830) "
UEFA Europa League Highlights
Hoogtepunten van alle wedstrijden in de UEFA Europa League.7.0
Fox Sports doc
Dejan Curovic - DJ Superstar
Samenvatting
Samenvatting
Fox Sports doc
Alleen onder de Lat
Eredivisie Highlights

Дата и время не отображаются, пока вы не откроете источник HTML.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Ваш пример HTML имеет неправильное форматирование: он пропускает <a> закрывающую скобку и некоторые кавычки в атрибутах стилей. Кроме того, если HTML-код правильный, вы можете использовать выражение Xpath для запроса HTML

$html = '
<a style="width: 149px;" data-time="6:00 am"></a>
<a style="width: 149px;" data-time="6:30 am"></a>
<a style="width: 149px;" data-time="7:00 am"></a>
<a style="width: 149px;" data-time="7:30 am"></a>
<a style="width: 99px;" data-time="7:00 am"></a>';

$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;

// here the document is completed with the missed html tag (body etc.)
// print $doc->saveHTML() to analyze the document
$doc->loadHTML($html);

// query for attributes
$xpath = new DOMXPath($doc);
$res = $xpath->query("//@data-time");

// map attributes node values
$map = array();
foreach($res as $node) {
   $map[] = $node->value;
}

// expected results
var_dump($map);

Обратите внимание, что если предоставленный HTML-код не является действительным HTML-файлом, библиотека DOMDocument не очищает / не корректирует HTML-код, как это делает браузер, поэтому могут возникнуть некоторые ошибки синтаксического анализа или непредвиденное поведение.

Если, как в вашем примере, квадратные скобки заключены в результат, вам необходимо преобразовать результаты (если это действительный json, вы можете его проанализировать)

Примеры синтаксиса XPath
https://msdn.microsoft.com/en-us/library/ms256122(v=vs.110).aspx

Отрывок
https://repl.it/repls/ValuableMundaneConnection

0 голосов
/ 05 мая 2018

Предполагая, что это приходит как json:

$url = 'http://example.com/GS?cid=1234'
$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_USERAGENT => '',
    CURLOPT_TIMEOUT => 30,
    CURLOPT_CONNECTTIMEOUT => 30,
    CURLOPT_HEADER => false,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_MAXREDIRS => 5,
    CURLOPT_URL => $url,
 ));

 $result = curl_exec($curl);
 curl_close($curl);

 $html = json_decode($result);
 $doc = new DOMDocument();
 $doc->preserveWhiteSpace = false;
 $doc->loadHTML($html[0]);
 $get_time = $doc->getElementsByTagName('date-time');

 foreach($get_timeas $time)
 {
    echo $time;
 }
...