在DOMNodeList对象

时间:2018-05-04 23:33:04

标签: php curl dom domdocument

我需要一些关于代码的帮助,因为我在解析html源代码中的标记元素时遇到了问题。当我尝试这个时:

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

我将获得空输出。我试图像这样使用datetime

$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时它没有工作但是它没有。你能告诉我一个如何使用domdocument解析标签date-time的例子吗?

修改

这是我在使用var_dumpprint_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 :(得分:1)

假设这是以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;
 }

答案 1 :(得分:1)

您的示例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