2013-11-09 4 views
2

나는 stackoverflow에 대한 많은 예제를 살펴 보았지만 여전히 작동하지 않습니다.웹 사이트를 크롤링하고 테이블 데이터 가져 오기

내 스포츠 클럽의 포지션 테이블을 얻기 위해 웹 사이트를 크롤링하고 싶습니다.

제 문제는 테이블에서 "tr"컨텐츠를 가져올 수 없다는 것입니다. 처음에는 REGEX를 사용했지만 사람들이 추천하지 않기 때문에 XPath를 사용하지만 작동하지 않습니다. http://resultater.dai-sport.dk/tms/Turneringer-og-resultater/Pulje-Stilling.aspx?PuljeId=104

그리고 지금 내가 가지고있는 코드는 다음과 같습니다 :

I 크롤링 할 페이지는

$doc = new DOMDocument(); 
$doc->loadHTMLFile("http://resultater.dai-sport.dk/tms/Turneringer-og-resultater/Pulje-Stilling.aspx?PuljeId=104"); // or you could load from a string using loadHTML(); 
$xpath = new DOMXpath($doc); 
$elements = $xpath->query("/table/thead/tbody/tr"); 

print_r($elements); 

내가 얻고 그 결과는 다음과 같습니다 DOMNodeList 객체 ([길이] => 0)

전 완전히 잘못 됐나요?

+3

'thead'에서'tbody '를 찾고 계십니까? – PeeHaa

+0

해당 페이지에 테이블이 여러 개인 경우에 대비하여 테이블 ID로도 제한하고자 할 수 있습니다. – halfer

답변

1

@PeeHaa가 알 수 있듯이 tbody 태그는 thead 태그 (정상 코드) 안에 없습니다. 그러나 소스 코드에는 tbody 태그가 없습니다, 당신은 사용할 수 있습니다 : 당신이 사용할 수

$elements = $xpath->query("//table/tr"); 

사이트에서 데이터를 추출하려면 :

$elements = $xpath->query("//table/tr[contains(@class,'sr')]"); 

$keys = array('nb', 'hold', 'k', 'v', 'u', 't', 'scoreA', 'scoreB', 'p'); 

foreach ($elements as $elt) { 
    $results[] = array_combine($keys, 
    preg_split('~^\s++|\s++$|\h*+\R\s*+-?\s*+~', $elt->textContent, null, 1) 
    ); 
} 
echo '<pre>' . print_r($results, true); 

또 다른 방법은 preg_match()을 사용하는 것입니다 textContent의 구조를 설명합니다. 두 번째 링크가있는 예 :

$pattern = <<<'LOD' 
~ 
(?<kampnr>  [0-9]++     ) \s++ 
(?<dato>  [0-9]{2}-[0-9]{2}-[0-9]{2}) \s++ 
(?> 
    kl\. \s++ 
    (?<kl> [0-9]{2}:[0-9]{2}) \s++ 
)? 
(?<hjemmehold> .+?      ) \h*+ \R \s++ 
(?<udehold> .+?      ) \h*+ \R \s++ 
(?<spillA>  .+?      ) \h*+ \R \s++ 
(?<spillB>  .+?      ) \h*+ \R \s++ 
(?> 
    (?<resultatA> [0-9]++ ) \s*+ - \s*+ 
    (?<resultatB> [0-9]++ ) 
)? 
~xu 
LOD; 

foreach ($elements as $elt) { 
    if (preg_match($pattern, $elt->textContent, $match)) { 
     foreach($match as $k=>$v) { 
      if (is_numeric($k)) unset($match[$k]); 
     } 
     $result[] = $match; 
    }     
} 
echo '<pre>' . print_r($result, true); 
+0

안녕 Casimir et Hippoolyte, 나에게는 한 가지 문제가 더 있습니다. 어쩌면 당신도 거기에서 도울 수 있습니다 :-) 나는 또한 matchprogram을 크롤 링하고 싶습니다 - http://resultater.dai-sport.dk/tms/Turneringer-og-resultater/Pulje-Komplet-Kampprogram.aspx?PuljeId=104. 그러나 당신이 제게 제공 한 규범으로 그것을 할 때, 그것은 오직 저에게 첫 번째 경기를 제공하지만 다른 경기에서는 실패합니다. preg_split 함수에서 매개 변수 1을 0으로 변경하면 다른 모든 매개 변수를 제공하지만 첫 번째 매개 변수는 제공하지 않습니다. -/그 (것)들을 모두 얻고 싶습니까? –

+1

@AndreasBaran : preg_split 이외의 다른 방법으로 편집을 살펴보십시오. preg_split 함수의 1은 PREG_SPLIT_NO_EMPTY 옵션의 바로 가기입니다. –

관련 문제