2014-03-03 6 views
1

외부 HTML 테이블에서 100 행 3 열의 데이터를 스크랩하고 있습니다. 각 행의 데이터가 결합 된 10x10 테이블로 데이터를 구문 분석하고 싶습니다. 예 :DOMXPath에서 html 테이블 데이터 구문 분석

<tr> 
    <td>info1</td> 
    <td>info2</td> 
    <td>info3</td> 
</tr> 
<tr> 
    <td>info4</td> 
    <td>info5</td> 
    <td>info6</td> 
</tr> 
<tr> 
    <td>info7</td> 
    <td>info8</td> 
    <td>info9</td> 
</tr> 
...and so on 

I 출력 수

<tr> 
    <td>info1<br/>info2<br/>info3</td> 
    <td>info4<br/>info5<br/>info6</td> 
    <td>info7<br/>info8<br/>info9</td> 
    ...7 more times 
</tr> 
...9 more times 

으로 줄 바꿈을 사용하여 단일 열로 데이터. 나는 위에서하고 싶은 것을 할 생각이 전혀 없다. 또한 CSS를 사용하여 데이터의 스타일을 지정하고 싶습니다. 모든 도움/방향을 부탁드립니다. 이 작업을 수행 할 수

$doc = new DOMDocument(); 
    $doc->loadHTML($html); 
    libxml_clear_errors(); //remove errors for yucky html 

    xpath = new DOMXPath($doc); 
    $table = $xpath->query('//table[@id="idTable"]')->item(0); 
    $rows = $table->getElementsByTagName("tr"); 

    foreach($rows as $row) 
    { 
     $cells = $row -> getElementsByTagName('td'); 
     foreach ($cells as $cell) print $cell->nodeValue . "<br/>"; 
    } 
+1

그래서 문제가 무엇입니까? 새 테이블을 출력하려면 해당 테이블에 대한 스캐 폴딩을 출력해야합니다. 지금은 '

', ''또는 '
'이 출력에 표시되지 않고 원시 데이터를 버리고 있습니다. –

+0

@MarcB 잘 내 문제는 시각적으로 각 셀에 3 개의 기준과 특정 25x25 테이블에 대한 발판을 만들고 for 루프에서 인쇄하고 있습니다. – rambossa

+0

xpath는'$ table-> getElementsByTagName ('td')'이어야합니다. 당신은 html로 정의 된 순서대로 개별 tds를 얻습니다. 그리고 나서 그것들을 반복하여 새 테이블에 채우는 것은 간단합니다. 행이 무엇인지 신경 쓰지 않으므로 원본 테이블의 행을 완전히 무시할 수 있습니다. tds에 집중하십시오. –

답변

1

두 (유사) 방법 :

1) <tr>의를 계산하고 각 (10)을 결합함으로써, 그 <td> 수 무시 :

$doc=new DOMDocument(); 
$doc->loadHTML($html); 
$xpath=new DOMXPath($doc); 
echo "<table>\n"; 
/* 10 is the row count */ 
for($i=0;$i<10;$i++) 
{ 
    echo "<tr>\n"; 
    /* 10 is the column count */ 
    foreach($xpath->query('//table[@id="myTable"]/tr[position()>'.($i*10).' and position()<'.(($i+1)*10+1).']') as $tr) 
    { 
     echo "\t<td>";// "\t" to make it look nice 
     $tds=array(); 
     foreach($tr->childNodes as $td) 
     { 
      if($td->nodeName!="td") continue; 
      $tds[]=$td->firstChild->nodeValue; 
     } 
     echo implode("<br />",$tds); 
     echo "</td>\n"; 
    } 
    echo "</tr>\n"; 
} 
echo "</table>"; 
을 여기 내 코드입니다 새로운 <td>, 빗으로 <td> S를 계산하고 각 3 결합함으로써

Online demo

2) 오프라인 새로운 <tr>로 각 (30)은 <tr>들 무시 :

$doc=new DOMDocument(); 
$doc->loadHTML($html); 
$xpath=new DOMXPath($doc); 
echo "<table>\n"; 
$i=0; 
$tds=array(); 
foreach($xpath->query('//table[@id="myTable"]/tr/td/text()') as $td) 
{ 
    /* 30 is each row's old-cell-count */ 
    if($i%30==0) echo "<tr>\n"; 
    $tds[]=$td->nodeValue; 
    /* 3 is each cell's old-cell-count */ 
    if($i%3==2) 
    { 
     echo "\t<td>".implode("<br />",$tds)."</td>\n"; 
     $tds=array(); 
    } 
    if($i%30==29) echo "</tr>\n"; 
    $i++; 
} 
echo "</table>"; 

Online demo

모두 출력 :

<table> 
<tr> 
    <td>info0.1<br />info0.2<br />info0.3</td> 
    <td>info1.1<br />info1.2<br />info1.3</td> 
    <td>info2.1<br />info2.2<br />info2.3</td> 
    <td>info3.1<br />info3.2<br />info3.3</td> 
    <td>info4.1<br />info4.2<br />info4.3</td> 
    <td>info5.1<br />info5.2<br />info5.3</td> 
    <td>info6.1<br />info6.2<br />info6.3</td> 
    <td>info7.1<br />info7.2<br />info7.3</td> 
    <td>info8.1<br />info8.2<br />info8.3</td> 
    <td>info9.1<br />info9.2<br />info9.3</td> 
</tr> 
<tr> 
    <td>info10.1<br />info10.2<br />info10.3</td> 
    <td>info11.1<br />info11.2<br />info11.3</td> 
<!-- ... --> 
    <td>info97.1<br />info97.2<br />info97.3</td> 
    <td>info98.1<br />info98.2<br />info98.3</td> 
    <td>info99.1<br />info99.2<br />info99.3</td> 
</tr> 
</table> 
+0

선생님, 고맙습니다. 제 2의 옵션을 사용했는데 효과가있었습니다. 감사합니다. – rambossa

관련 문제