在所有情况下使用XPath和PHP进行打印

时间:2013-06-29 18:22:17

标签: php xpath

我正在尝试使用XPath和PHP从每个URL中提取一些信息。即使XPath查询没有返回任何内容,为每个URL打印一些内容也很重要。因此,我尝试设置我的脚本以打印出N/A,其中XPath没有返回任何结果。但是,永远不会输入此else子句,并且永远不会打印N/A

scrape.txt包含50个网址。返回47/50 URL的结果。我不关心我的XPath查询,但更多关于脚本本身为每个尝试的URL返回一些值。

有人可以帮我确定发生这种情况的原因并帮助我找到一种方法来保证打印字符串是否打印出来,无论是否有从XPath查询返回的结果?

我很感激任何建议。非常感谢提前!

$file = fopen('scrape.txt', "r");

$output = array();

while(!feof($file)){
    $line = fgets($file);

    $doc = new DOMDocument();
    $doc->loadHTMLFile($line);

    $XPath = new DOMXPath($doc);

    $elements = $XPath->query("//ul/li[1]/a[@class='geMain']");

    if (!is_null($elements)) {
        foreach ($elements as $element) {
            $nodes = $element->childNodes;
            foreach ($nodes as $node) {
                if(strcmp($node->nodeValue, "")!=0){
                    $output[] = trim($node->nodeValue);
                }
            }
        }
    }else{
        $output[] = "N/A";
    }   
}
array2csv($output);

2 个答案:

答案 0 :(得分:1)

DOMXpath->query会返回DOMNodeList元素,无论是否有结果。测试其length值:

if ($elements->length == 0) {
  // No results found
} else {
  foreach ($elements as $element) {
    // for each result
  } 
}

答案 1 :(得分:1)

您可以尝试以下方法,但我不确定我是否完全理解问题的本质是什么:

$file = fopen('scrape.txt', "r");

$output = array();

while(!feof($file)){
    $line = fgets($file);

    $doc = new DOMDocument();
    $doc->loadHTMLFile($line);

    $XPath = new DOMXPath($doc);

    $elements = $XPath->query("//ul/li[1]/a[@class='geMain']");

    $haveOutput = false;
    if (!is_null($elements)) {
        foreach ($elements as $element) {
            $nodes = $element->childNodes;
            foreach ($nodes as $node) {
                if(strcmp($node->nodeValue, "")!=0){
                    $output[] = trim($node->nodeValue);
                    $haveOutput = true;
                }
            }
        }
    }

    if (!$haveOutput) {
        $output[] = "N/A";
    }   
}
array2csv($output);