2013-06-29 57 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

相關問題