2017-12-20 19 views
1

다음 코드를 사용하여 초기 문제를 해결했습니다. 이제 반환 된 데이터를 처음 5 개 행으로 제한하는 방법을 알아야합니다. foreach 루프를 어떻게 제한합니까?긁힌 데이터 서식 지정 및 foreach 루프 제한

site에서 데이터를 스크래핑 중입니다. DOM을 통과하여 3 개월 또는 "지난 1 개월 (11/20/2017-12/19/2017)"테이블을 가져올 수 있습니다. 2 ". 그러나 나는 정확한 결과물을 얻을 수 없다. 각 행에 코드에 지정된 td가 들어있는 테이블에 포장해야합니다. 다음은 제한된 성공을 사용하는 코드입니다.

<?php 
    $html = file_get_contents('https://ninjatrader.isystems.com/Systems/TopStrategies'); 
    $doc = new DOMDocument(); 
    @$doc->loadhtml($html); 
    $xpath = new DOMXPath($doc); 

    echo "<table>"; 
    foreach($xpath->query('//table')->item(2)->getElementsByTagName('tr') as $rows) { 
    $cells = $rows->getElementsByTagName('td'); 

    echo "<tr> 
      <td>" . $cells->item(1)->textContent . "</td> 
       <td>" . $cells->item(2)->textContent . "</td> 
       <td>" . $cells->item(3)->textContent . "</td> 
       <td>" . $cells->item(5)->textContent . "</td> 
      </tr>"; 
    } 
    echo "</table>"; 
?> 

그래, 위와 관련된 문제는 거의 해결되었습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

+1

@ 오류를 억제한다. 따라서 loadhtml에 문제가 있으면 브라우저 (또는 명령 줄 항목을 수행하는 경우 화면)로 푸시하지 않습니다. https://stackoverflow.com/questions/2002610/character-before-a를 참조하십시오. -function-call – DragonYen

+0

고마워요 @DragonYen, 그래서 간단한 방법입니다 -> libxml_use_internal_errors (TRUE); ? –

답변

1

nodeName 속성을 통해 태그 이름에 액세스 한 다음 태그의 다른 부분을 문자열로 출력에 추가 할 수 있습니다.

echo "<" . $cells->item(1)->nodeName . ">"; 
echo $cells->item(1)->textContent; 
echo "</" . $cells->item(1)->nodeName . ">"; 

"TD"요소에 대한보다 설득력 방법 :

for($i = 1; $i < 6; $i++) 
{   
    if ($i != 4 && $cells->length > 4) { 
     echo "<td>" . $cells->item($i)->textContent . "</td>"; 
    } 
} 

주요 나는이처럼 써서 루프, 출력 새로운 라인에 각 요소에 대해. 새 행이 필요하지 않으면 "\ n"을 제거하십시오. 배열 키를 $ index로 사용하여 foreach 루프를 제한 할 수 있습니다. 이 경우 행 0은 비어 있으므로 첫 번째 5 개의 행을 가져 오는 것은 $index < 6입니다. 행 0 데이터를 가지고 있다면, 당신은 $index < 5

$rows = $xpath->query('//table')->item(2)->getElementsByTagName('tr'); 
echo "<table>\n"; 
foreach($rows as $index => $row) { 
    $cells = $row->getElementsByTagName('td'); 
    if ($cells->length > 4 && $index < 6) { 
    echo "<tr>\n"; 
    for($i = 1; $i < 6; $i++) 
    {   
     if ($i != 4) { 
     echo "<td>" . $cells->item($i)->textContent . "</td>\n"; 
     } 
    } 
    echo "</tr>\n"; 
    } 
} 
echo "</table>\n"; 

참조를 사용할 수 있습니다

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

http://php.net/manual/en/control-structures.for.php

http://php.net/manual/en/control-structures.foreach.php

+0

닫기,하지만 상단에 "<>"묶음을 출력 한 다음 태그와 같은 XML에 내용의 일부를 줄 바꿈했습니다. –

+0

내용 태그를 수정하기 위해 내 대답을 편집했습니다. 꼭대기에 빈 행이 있었을 것입니다. 그래서 나는 그것을 길이로 필터링했습니다. – Matts

+0

위대한 작품. '좀 더 설득력있는'접근법에서 for 루프는 foreach를 대체합니까? –