2016-07-15 133 views
-1

我試圖得到的消息在某些div所有鏈接URL從這個網站php:如何從給定頁面的特定div獲取所有超鏈接?

要獲得所有的鏈接,之後我查看源代碼,但沒有什麼。

但有任何數據顯示

可以在任何能夠理解PHPArray()JS幫助我,好嗎?

這是我的代碼來獲取內容:

$html = file_get_contents("https://qc.yahoo.com/"); 
if ($result === FALSE) { 
    die("?"); 
} 
echo $html; 
+0

我有一個很難理解。如果您向我們展示'$ html'輸入示例,以及您完成處理時想要的內容,這將有所幫助。只是一個小樣本,足以讓我們明白你想要做什麼。 – BeetleJuice

+0

hy @BeetleJuice有你檢查http://stackoverflow.com/a/38396700/6516181,我的意思是,對不起,我沒有先進的編碼和關鍵字的名稱。請你的幫助^^ – ane

回答

1

假設,你想從給定的頁面提取所有Anchor標籤與他們的超鏈接。

現在有一定的問題,在該網址上做file_get_contents

  1. 字符編碼壓縮,即gzip
  2. SSL的URL的驗證。

因此,克服gzip字符編碼的第一個問題,我們將使用捲曲如@ gregn3在他的回答提出。但他錯過了使用CURL的能力來自動解壓縮內容。

對於第二個問題,您可以按照this指南或從CURL的curl_setopt方法中禁用SSL驗證。

現在將提取指定頁面所有鏈接的代碼是:

<?php 

$url = "https://qc.yahoo.com/"; 

# download resource 
$c = curl_init ($url); 
curl_setopt($c, CURLOPT_HTTPHEADER, ["Accept-Encoding:gzip"]); 
curl_setopt ($c, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($c, CURLOPT_ENCODING , "gzip"); 
curl_setopt($c, CURLOPT_VERBOSE, 1); 
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 0); 
$content = curl_exec ($c); 

curl_close ($c); 

$links = preg_match_all ("/href=\"([^\"]+)\"/i", $content, $matches); 

# output results 
echo "url = " . htmlspecialchars ($url) . "<br>"; 
echo "links found (" . count ($matches[1]) . "):" . "<br>"; 
$n = 0; 
foreach ($matches[1] as $link) 
{ 
    $n++; 
    echo "$n: " . htmlspecialchars ($link) . "<br>"; 
} 

但是,如果你想要做提前HTML解析,那麼你就需要使用PHP Simple HTML Dom Parser。在PHP Simple HTML Dom中,您可以使用jQuery選擇器來選擇div並獲取anchor tags。這裏是documentation &​​。

+0

謝謝@Deepak,我對CURL不是很熟悉,但現在我也瞭解這一點。 :) – gregn3

+0

不,我喜歡這個。這讓我更加明白。謝謝你的描述和知識先生:*吻擁抱..#真棒btw你有什麼社會,我想加你先生 – ane

+0

:)和對不起,我不知道* socmed *是什麼。 –

0

要查找在HTML的各個環節,你可以使用preg_match_all()。

$links = preg_match_all ("/href=\"([^\"]+)\"/i", $content, $matches); 

該URL https://qc.yahoo.com/使用gzip壓縮,所以你必須檢測和使用功能gzdecode解壓()。 (它必須安裝在您的PHP版本中)

gzip壓縮由Content-Encoding: gzip HTTP標頭指示。您必須檢查該標題,因此您必須使用curl或類似的方法來檢索標題。 (file_get_contents()函數不會給你的HTTP頭......這僅下載gzip壓縮的內容,您需要檢測,它被壓縮,但對於需要讀頭)。

下面是一個完整例如:

<?php 

$url = "https://qc.yahoo.com/"; 

# download resource 
$c = curl_init ($url); 
curl_setopt ($c, CURLOPT_HEADER, true); 
curl_setopt ($c, CURLOPT_RETURNTRANSFER, true); 
$content = curl_exec ($c); 
$hsize = curl_getinfo ($c, CURLINFO_HEADER_SIZE); 
curl_close ($c); 

# separate headers from content 
$headers = substr ($content, 0, $hsize); 
$content = substr ($content, $hsize); 

# check if content is compressed with gzip 
$gzip = 0; 
$headers = preg_split ('/\r?\n/', $headers); 
foreach ($headers as $h) 
{ 
    $pieces = preg_split ("/:/", $h, 2); 
    $pieces2 = (count ($pieces) > 1); 
    $enc = $pieces2 && (preg_match ("/content-encoding/i", $pieces[0])); 
    $gz = $pieces2 && (preg_match ("/gzip/i", $pieces[1])); 
    if ($enc && $gz) 
    { 
     $gzip = 1; 
     break; 
    } 
} 

# unzip content if gzipped 
if ($gzip) 
{ 
    $content = gzdecode ($content); 
} 


# find links 
$links = preg_match_all ("/href=\"([^\"]+)\"/i", $content, $matches); 

# output results 
echo "url = " . htmlspecialchars ($url) . "<br>"; 
echo "links found (" . count ($matches[1]) . "):" . "<br>"; 
$n = 0; 
foreach ($matches[1] as $link) 
{ 
    $n++; 
    echo "$n: " . htmlspecialchars ($link) . "<br>"; 
} 
+1

hy @ gregn3謝謝理解我的帖子我不知道關鍵字,在我使用你的代碼後,我得到了eroor,在這裏我檢查我的php 5.6.23,gzdecode確定,zlib擴展加載,**但** PHP致命錯誤:調用未定義的函數gzip_inflate()生成..爲什麼?請你幫忙。 – ane

+1

btw抱歉,我想給予upvote **但**感謝您的反饋!記錄下少於15名聲望的演員的投票,但不要更改公開顯示的帖子分數#myrputation是壞T.T – ane

+0

例如,如果我打開表格原始網站有10個鏈接。 **但**當我捲曲的網站,他們只顯示5個鏈接..如何顯示所有鏈接? – ane

3
$html = new DOMDocument(); 
@$html->loadHtmlFile('https://qc.yahoo.com/'); 
$xpath = new DOMXPath($html); 
$nodelist = $xpath->query("//div[@id='news_moreTopStories']//a/@href"); 
foreach ($nodelist as $n){ 
echo $n->nodeValue."\n"; 
} 

您可以從您指定的div中獲取所有鏈接。請確保您將div ID設爲id='news_moreTopStories']。您正在使用xpath來查詢div。你不需要大量的代碼,只需要這一部分。

http://php.net/manual/en/class.domxpath.php

+0

hy先生,謝謝你幫助我們,這將爲我增加更多的解決方案^^ – ane

+0

@ane不客氣。我很高興能夠提供幫助。 – unixmiah

+0

是的,這是一個更好的解決方案,但它似乎沒有解碼gzip-ed內容。 – gregn3

相關問題