2016-07-15 3 views
-1

나는이 웹에서 div의 뉴스의 모든 링크 URL을 얻으려고합니다.php : 주어진 페이지의 특정 div에서 모든 하이퍼 링크를 얻는 방법?

소스를 보았지만 아무 것도 없습니다.

그러나 PHP, Array()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 태그를 추출합니다. 압축에 대한

  1. 문자 인코딩, URL의 즉 gzip
  2. SSL 인증 :

    는 이제 URL에 file_get_contents 일에 어떤 문제가 있습니다.

따라서 gzip 문자 인코딩의 첫 번째 문제를 극복하기 위해 CURL을 @ gregn3으로 사용합니다. 그러나 그는 CURL이 자동으로 내용을 압축 해제하는 기능을 사용하지 않고 gzip 콘텐츠를 보지 못했습니다.

두 번째 문제는 CURL의 curl_setopt 방법에서 this 가이드를 따르거나 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 & api manual입니다.

+0

고마워요 @Deepak, 저는 CURL에 익숙하지 않았지만 지금은 이것에 대해서도 알고 있습니다. :) – gregn3

+0

나는 이것을 좋아하지 않는다. 이것은 나를 더 이해하게한다. 묘사 및 지식 선생님에게 감사드립니다 : * 키스 포옹 .. # 굉장한 btw 무엇 socmed, 나는 너를 – ane

+0

:)을 추가하고 싶다 그리고 미안, 나는 무엇이 * socmed *인지 모른다. –

0

당신으로, preg_match_all을 사용할 수 있습니다 HTML에있는 모든 링크를 찾으려면() :

는 콘텐츠를 내 코드입니다.

$links = preg_match_all ("/href=\"([^\"]+)\"/i", $content, $matches); 
URL https://qc.yahoo.com/가 GZIP 압축을 사용하는

, 그래서 당신은 그것을 감지 기능 gzdecode를 사용하여 압축을 해제해야합니다(). (PHP 버전에 설치해야합니다)

gzip 압축은 Content-Encoding: gzip HTTP 헤더로 표시됩니다. 헤더를 검사해야하므로 말풍선이나 비슷한 방법으로 헤더를 검색해야합니다. (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 내 게시물을 이해해 주셔서 감사합니다, 내가 당신의 코드를 사용하고 난 후에 내가 키워드를 아는 데 감사드립니다. 여기, 제 PHP 5.6.23, gzdecode OK, zlib 확장이로드되었음을 확인했습니다. ** 그러나 ** PHP 치명적인 오류 : 정의되지 않은 함수 gzip_inflate() generate .. 호출 왜? 도와주세요. – ane

+1

btw 미안 내가 포기하고 싶다 전에 ** 그러나 ** 피드백에 감사드립니다! 15 명 미만의 평판을 가진 사람이 쓴 투표는 기록되지만 공개적으로 게시 된 점수는 변경하지 마십시오. # 정식은 나쁜 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']에 입력하십시오.div34를 쿼리하려면 xpath을 사용하고 있습니다. 당신은이 부분 만 코드 톤을 필요로하지 않습니다.

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

+0

선생님, 도와 주셔서 고맙습니다. 더 많은 해결책을 추가하겠습니다 ^^ – ane

+0

@ane 환영합니다. 내가 도울 수있어 기쁘다. – unixmiah

+0

네,이게 더 나은 해결책이지만 gzip으로 편집 된 내용은 디코드하지 않는 것 같습니다. – gregn3

관련 문제