2009-10-20 18 views
0

안녕하세요. Curl을 사용하면서 읽고있는 웹 사이트의 홈페이지가 있습니다. 사이트에있는 페이지 수를 확보해야합니다. 내가 필요로하는웹 페이지에서 값 추출

<div class="pager"> 
<span class="page-numbers current">1</span> 
<a href="/users?page=2" title="go to page 2"><span class="page-numbers">2</span></a> 
<a href="/users?page=3" title="go to page 3"><span class="page-numbers">3</span></a> 
<a href="/users?page=4" title="go to page 4"><span class="page-numbers">4</span></a> 
<a href="/users?page=5" title="go to page 5"><span class="page-numbers">5</span></a> 
<span class="page-numbers dots">&hellip;</span> 

<a href="/users?page=15" title="go to page 15"><span class="page-numbers">15</span></a> 
<a href="/users?page=2" title="go to page 2"><span class="page-numbers next"> next</span></a> 
</div> 

값은 15이지만,이 사이트에 따라 모든 숫자가 될 수 있지만, 항상 같은 위치에있을 것입니다 : -

정보는 사업부입니다.

이 값을 쉽게 읽고 PHP의 변수에 어떻게 할당 할 수 있습니까?

감사

조나단

답변

2

당신은 그것에 대해 PHP's DOM module를 사용할 수 있습니다. DOMDocument :: loadhtmlfile()을 사용하여 페이지를 읽고 DOMXPath 객체를 만들고 class = "page-numbers"속성을 갖는 문서 내의 모든 범위 요소를 쿼리합니다.

(편집 : 죄송합니다, 그것은하지 당신이 찾고있는 무엇을, 두 번째 코드 참조)

$html = '<html><head><title>:::</title></head><body> 
<div class="pager"> 
<span class="page-numbers current">1</span> 
<a href="/users?page=2" title="go to page 2"><span class="page-numbers">2</span></a> 
<a href="/users?page=3" title="go to page 3"><span class="page-numbers">3</span></a> 
<a href="/users?page=4" title="go to page 4"><span class="page-numbers">4</span></a> 
<a href="/users?page=5" title="go to page 5"><span class="page-numbers">5</span></a> 
<span class="page-numbers dots">&hellip;</span> 

<a href="/users?page=15" title="go to page 15"><span class="page-numbers">15</span></a> 
<a href="/users?page=2" title="go to page 2"><span class="page-numbers next"> next</span></a> 
</div> 
</body></html>'; 

$doc = new DOMDocument; 
// since the content "is already here" we use loadhtml(content) 
// instead of loadhtmlfile(url) 
$doc->loadhtml($html); 
$xpath = new DOMXPath($doc); 
$nodelist = $xpath->query('//span[@class="page-numbers"]'); 
echo 'there are ', $nodelist->length, ' span elements having class="page-numbers"'; 

편집 : 수행이

<a href="/users?page=15" title="go to page 15"><span class="page-numbers">15</span></a> 

(두 번째 마지막 a 요소) 항상 점 마지막 페이지로, 즉이 링크에 찾고있는 값이 포함되어 있습니까?
그런 다음 두 번째이지만 마지막으로 a 요소를 선택하고 그 하위 요소 인 span 요소를 선택하는 XPath 식을 사용할 수 있습니다.

//div[@class="pager"] <- select each <div> where the attribute class equals "pager" 
//div[@class="pager"]/a <- select each <a> that is a direct child of the pager div 
//div[@class="pager"]/a[position()=last()-1] <- select the <a> that is second but last 
//div[@class="pager"]/a[position()=last()-1]/span <- select the direct child <span> of that second but last <a> element in the pager <div> 

는 직접적인 함수 나 그렇게 쉬운 방법이 없습니다

$doc->loadhtml($html); 
$xpath = new DOMXPath($doc); 
$nodelist = $xpath->query('//div[@class="pager"]/a[position()=last()-1]/span'); 
if (0 < $nodelist->length) { 
    echo $nodelist->item(0)->nodeValue; 
} 
else { 
    echo 'not found'; 
} 
+0

멋진 - 그것은 –

+0

안녕 내가 이것을 시도했지만 제로 기능 getusers ($의 userurl) { $ 반환에 내가 기대 덕분에 doc = 새 DOMDocument; $ doc-> loadhtml ($ userurl); $ xpath = 새 DOMXPath ($ doc); $ nodelist = $ xpath-> query ('// span [@ 클래스 = "페이지 번호"]'); print_r ($ nodelist); 'there are', $ nodelist-> length, 'span 요소가 class = "page-numbers"'를 갖습니다. } URL은 http://ask.recipelabs.com/users –

+1

입니다. URL을 전달하면 loadhtmlFILE()이 필요하고 loadhtml()은 필요하지 않습니다. – VolkerK

0

(당신은 ;-) 좋은 XPath를 자습서를 가져 오기 할 수 있습니다). 이를 수행하려면 existing HTML parser을 빌드하거나 사용해야합니다.

0

정규식으로 구문 분석 할 수 있습니다. 먼저 <span class="page-numbers">의 모든 occurense을 찾을 후, 마지막 하나를 선택

// div html code should be in $div_html 
preg_match_all('#<span class="page-numbers">(\d+)#', $div_html, $page_numbers); 
print_r(end($page_numbers[1])); // prints 15 
0

이것은 당신을위한 XPath를 사용하는 것이 좋습니다 것입니다 무언가이다 - DOM 문서 객체로 페이지를로드 요구하는 :

$domDoc = new DOMDocument(); 
$domDoc->loadHTMLFile("http://path/to/yourfile.html"); 
$xp = new DOMXPath($domDoc); 
$nodes = $xp->query("//xpath/to/relevant/node"); 
$value = $nodes[0]; 

나는 잠시 동안 좋은 xpath를 작성하지 않았으므로 그 부분을 이해하기 위해 약간의 독서를해야하지만 너무 어렵지 않아야합니다.

0

아마도

$nodes = $dom->getElementsByTagName("span"); 
$maxPageNum = 0; 
foreach($nodes as $node) 
{ 
    if($node.class == "page-numbers" && $node.value > $maxPageNum) 
    { 
     $maxPageNum = $node.value; 
    } 
} 

나는 어쩌면이 DOM 노드의 클래스/내부 텍스트를 액세스하기 위해 그 쉬운 일이 아니다, PHP를 모르지만, 그 정보와 의사를 얻을 수있는 방법이 있어야합니다 여기가 작동해야합니다.

0

큰 도움을 주신 덕분에 Volkerk에게 감사드립니다. 정말 잘했습니다.나는 몇 약간의 변경을했고, 이것으로 끝났다 : -

function getusers($userurl) 
{ 
$sSourceData = file_get_contents($userurl); 
$doc = new DOMDocument(); 
@$doc->loadHTML($sSourceData); 

$xpath = new DOMXPath($doc); 
$nodelist = $xpath->query('//div[@class="pager"]/a[position()=last()-1]/span'); 
if (0 < $nodelist->length) { 

    $lastpage = $nodelist->item(0)->nodeValue; 
    $users = $lastpage * 35; 
    $userurl = $userurl.'?page='.$lastpage; 

    $sSourceData = file_get_contents($userurl); 

$doc = new DOMDocument(); 
@$doc->loadHTML($sSourceData); 
$xpath = new DOMXPath($doc); 
$nodelist = $xpath->query('//div[@class="user-details"]'); 
$users = $users + $nodelist->length; 
echo 'there are ', $users , ' users'; 

} 
else { 
$xpath = new DOMXPath($doc); 
$nodelist = $xpath->query('//div[@class="user-details"]'); 
echo 'there are ', $nodelist->length, ' users'; 
} 


}