2011-03-14 12 views
1

PHP의 DOMDocument-> loadHTML() 시스템을 사용하여 다음 데이터 (</b> 태그 뒤 4.0m)를 얻는 가장 좋은 방법은 무엇입니까? 어떤 종류의 CSS-stye 선택기를 추측하고 있습니까?수천 번이 데이터를 가져 오는 가장 효율적인 방법은 무엇입니까?

(LINE 240, always 240) <b>Current Price:</b> 4.0m

나는 문서를 둘러보고되었지만, 솔직히 말해서이 나에게 모든 완전히 외계인이다! 또한, 어떻게 같은 URL의 페이지의 수천이 데이터를 얻을 수있을 것입니다 :

http://site.com/q=item/viewitem.php?obj=11928

obj=# 최소/최대 값이 알려져있다 (내가 긁어해야합니다 얼마나 많은 페이지) 및 나는 모든 것을 점진적으로 집어 넣고, namedescriptionprice (아직까지 백분율 상승/하락에 관해서는별로 신경 쓰지 않음)을 MySQL 데이터베이스에 출력하려고합니다. 그래서 거기에서 그것을 가져 와서 내 사이트에 표시 할 수 있습니다. 사람이 가야하는 방법에 대한 골격 힌트를 제공 할 수있는 경우

<div class="subsectionHeader"> 
<h2> 
Item Name 
</h2> 
</div> 
<div id="item_additional" class="inner_brown_box"> 
Description of item goes here. 
<br> 
<br> 
<b>Current Price:</b> 4.0m 
<br><br> 
<b>Change in Price:</b><br> 
<span> 
<b>30 Days:</b> <span class="rise">+2.5%</span> 
</span> 
<span class="spaced_span"> 
<b>90 Days:</b> <span class="drop">-30.4%</span> 
</span> 
<span class="spaced-span"> 
<b>180 Days:</b> <span class="drop">-33.3%</span> 
</span> 
<br class="clear"> 
</div> </div> <div class="brown_box main_page"> 
<div class="subsectionHeader"> ` 

, 그것은 많이 주시면 감사하겠습니다 :

저는 여기에 관심이 코드의 주요 블록입니다!

echo file_get_html('http://www.google.com/')->plaintext; 

를 그리고 PHP는 STR 기능을 사용하여 4.0M를 찾습니다 -

+0

아닌가요 거기에 액세스 할 수있는 RSS 피드가 있습니까? 스크래핑은 거의 보편적으로 나쁜 형태로 간주됩니다. –

+0

[가능한 가장 좋은 방법은 긁어 모으기 -> 저장 ->이 정보를 표시하는 것입니까?] (http://stackoverflow.com/questions/5305436/whats-the-most-efficient-way-to-scrape-store -display-this-information) –

답변

0

DOM 파싱이 가장 강력한 방법입니다. 당신이 가장 빠른 방법을 원하고, HTML 구조가 일관성이 있음을 알고있는 경우

, 아마 오프셋 (offset)를 검색 할 strpos를 사용하는 것이 더 빠를 것입니다. 그러나 페이지 구조가 변경되면 더 자주 손상 될 수 있습니다. 다음과 같은 내용 :

$needles = array(
    'name' => "<div class=\"subsectionHeader\">\n<h2>\n" 
    'description' => "<div id=\"item_additional\" class=\"inner_brown_box\">\n" 
    'price' => "<b>Current Price:</b> " 
); 
$buffer = file_get_contents("http://site.com/q=item/viewitem.php?obj=1234"); 
$result = array(); 
foreach ($needles as $key => $needle) { 
    $index1 = strpos($buffer, $needle); 
    $index2 = strpos($buffer, "\n", $index1); 
    $value = substr($buffer, $index1, $index2 - $index1); 
    $result[$key] = $value; 
} 

뒤 공백을 포함하여 정확한 바늘을 가져와야합니다.

1

HTML을 정규식으로 구문 분석하는 것은 좋지 않은 생각이지만, 귀하의 경우에는 나에게 맞거나 쉬운 방법 일 수 있습니다. strpos 및 일반 텍스트 패턴으로 청킹하는 것보다 충분히 빠르며 유연합니다.

위에 지정된 소스 HTML이 예를보십시오 :하지만 RegexBuddy 또는 프레소 간단한 것들을 쓸 수있는 사람과 같은 documenation 좋은 도구, 너무 복잡 보일 수 있습니다

//checked with php 5.3.3 
if (preg_match('#<h2>(?P<itemName>[^>]+)</h2>.*?<div[^>]+id=([\'"])item_additional(\2)[^>]*>\s*(?P<description>[^<]+).*?<b>\s*Current\s+Price\s?:?</b>\s*(?P<price>[^<]+)#six',$src, $matches)) 
{ 
    print_r($matches); 
} 

정규 표현식을)

관련 문제