2013-06-29 41 views
-2

我想使用XPath和PHP从每个URL中提取一些信息。即使从XPath查询返回任何内容,为每个URL都打印一些内容也很重要。因此,我试图设置脚本来打印出N/A,XPath没有返回任何结果。但是,从不输入此else子句,并且从不打印N/A在所有情况下使用XPath和PHP进行打印

scrape.txt包含50个URL。结果返回47/50网址。我不关心我的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); 

回答

1

DOMXpath->query返回DOMNodeList元素,如果有结果还是不行不管。其length值测试:

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

+1,这也正是我需要,谢谢! – AnchovyLegend

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); 
+0

+1,谢谢你的回复。我没有测试过这个,但这看起来好像会起作用。 – AnchovyLegend

相关问题