如何解析网页将simplexml_import_dom改成DOMXPath?

How to parse the web page to change simplexml_import_dom into DOMXPath?

网页http://php.net中的所有链接都是用代码1中的simplexml_import_dom提取的。

code1
<?php
$dom = new DOMDocument();
$dom->loadHTMLFile('http://php.net');
$xml = simplexml_import_dom($dom);
$nodes = $xml->xpath('//a[@href]');
foreach ($nodes as $node) {
    echo $node['href'], "<br />\n";
}
?>

现在我想用 DOMXPath 解析网页,在代码 1 中更改 simplexml_import_dom 进入code2中的DOMXPath,code2中有一个错误,如何解决?

code2
<?php
$html = file_get_contents('http://php.net');
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a[@href]');
foreach ($nodes as $node) {
    echo $node['href'], "<br />\n";
}
?>

要解析所有的 href 标签:

$sHtml = file_get_contents('http://php.net');
// var_dump( $sHtml );
$oDom = new DOMDocument( '1.0', 'utf-8' );
// Supress <DOCTYPE> notices
libxml_use_internal_errors(true);
$oDom->loadHTML('<?xml encoding="UTF-8">' . $sHtml );
// var_dump( $oDom );
$oXPath = new DOMXPath( $oDom );
$oNodes = $oXPath->query( '//a/@href' );
foreach( $oNodes as $oNode )
{
    // var_dump( $oNode );
    echo $oNode->nodeValue, "<br />\n";
}
// Supress <DOCTYPE> notices
libxml_use_internal_errors(false);

查询返回的数据是对象而不是数组!

如果您收到如下警告:

Warning: DOMDocument::loadHTML(): Tag nav invalid in Entity

在输出中,您可以在 loadHTML 函数调用之前添加这一行

因为文档中使用了 html5 标签

libxml_use_internal_errors(true);

代码:

$html =  file_get_contents('http://php.net');
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a[@href]');
foreach ($nodes as $node) {
    echo $node->getAttribute("href"), "<br />\n";
}