2016-12-19 75 views
0

我想要得到這個頻道擁有捲曲的訂戶數量,但似乎我得到一個空數組,有什麼幫助?Curl和preg_match_all錯誤

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "https://www.youtube.com/channel/UCU3i-l-rqTVGQj3Q3LePhJQ"); 
curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1"); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept-Language: es-es,en")); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$result = curl_exec($ch); 
//para mostrar posibles error 
$error = curl_error($ch); 
curl_close($ch); 

//parsear 

preg_match_all("(<a class=\"secondary-header-action\" href=\"/subscribers\" role=\"menuitem\"> 
     <span class=\"nav-text\"> 
      (.*) 
     </span> 
     </a>)siU", $result, $matches); 

print_r($matches); 
+1

難道你不能只使用API​​而不是野人? – PeeHaa

+0

嗨,我只是想學習使用捲髮,這是一個真正的例子,試圖從YouTube上提取數據 – Sociopath

+1

然後,你最好使用DOMDocument並獲得你需要的值。你的正則表達式很可能不起作用,因爲'>'和'<'之間的間距是有意義的 –

回答

1

解析HTML時,最安全的方法是使用HTML DOM解析器。下面是發生在$result HTML字符串,並得到所有文本內span標籤與導航文本類中a標籤與secondary-header-action類的一個示例代碼:

$result = <<<DATA 
<body> 
<a class="secondary-header-action" href="/subscribers" role="menuitem"> 
<span class="nav-text">Some text here</span> 
</a> 
</body> 
DATA; 

$dom = new DOMDocument('1.0', 'UTF-8'); 
$dom->loadHTML($result, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

$xpath = new DOMXPath($dom); 
$atags = $xpath->query('//a[@class="secondary-header-action"]/span[@class="nav-text"]'); 
$res = array(); 

foreach($atags as $a) { 
    array_push($res, $a->nodeValue); 
} 

print_r($res); // => Array ([0] => Some text here) 

PHP demo

的DOM被初始化與DOMDocumentDOMXPath有助於通過xpath表達式訪問DOM樹中的必要元素。