创建解析器的麻烦

时间:2014-05-18 14:25:46

标签: php parsing

我试过使用我在互联网上找到的例子......但它们没有用。

<?php
$sUrl = 'https://www.google.cz/';
$sUrlSrc = getWebsiteContent($sUrl);

// Load the source
$dom = new DOMDocument();
@$dom->loadHTMLFile($sUrl);

$xpath = new DomXPath($dom);

echo $xpath->query("/html/body[@id='gsr']/div[@id='viewport']/div[@id='main']/span[@id='body']/center/div[@id='lga']/div/div[@id='hplogo']");
?>

这应该得到这个文本:Českárepublika。但没有任何事情发生。 PHP Ver:5.3

2 个答案:

答案 0 :(得分:1)

当您尝试echo $xpath->query(...);时,您的代码没有发出致命错误这一事实表明您的DOMXPath对象无效(请参阅下面的#2);如果这无效,则实际的DOMDocument无效,这意味着它无法加载您指向的数据(即https://www.google.cz

如果这是真的,那很可能是因为您当前的PHP设置没有启用php_openssl扩展名。没有它,PHP不知道如何加载https包装器并且无法加载数据。

要验证,请确保您已启用以下错误报告(只需将它们放在脚本的顶部):

error_reporting(E_ALL);
ini_set('display_errors', 1);

启用php_openssl扩展程序后,您应该再遇到两个错误:

  1. 您编写的xpath查询非常复杂(实际上并不正确;我还没有验证&#34;正确的完整路径&#34;但是,你现在的人并没有带回结果)。相反,您可以利用您之后的节点具有id属性的事实,该属性应该是唯一的:

    $nodes = $xpath->query('//div[@id="hplogo"]');
    
  2. 您不能简单地回显DOMXPath::query()的返回值;这样做会导致致命错误Object of class DOMNodeList could not be converted to string。相反,您可以执行以下任一操作:

    // if you expect multiple values
    $nodes = $xpath->query('//div[@id="hplogo"]');
    foreach ($nodes as $node) {
        echo $node->nodeValue . '<br />';
    }
    
    // or
    
    // if you expect a single value
    $node = $xpath->query('//div[@id="hplogo"]')->item(0)->nodeValue;
    echo $node;
    

答案 1 :(得分:0)

你想要的是:

<?php
$sUrl = 'https://www.google.cz/';
$sUrlSrc = file_get_contents($sUrl);

// Load the source
$dom = new DOMDocument();
@$dom->loadHTMLFile($sUrl);

$xpath = @new DomXPath($dom);

echo $xpath->query("//div[@id='hplogo']")->item(0)->nodeValue;

请注意,您不需要浏览整个html来查找ID(始终是唯一的)。