2016-12-17 13 views
0

私はfile_get_contentsでウェブサイトからhtmlを取得しています。私はhtmlの中にテーブル(クラス名付き)を持っており、htmlタグの中にデータを入れたいと思っています。file_get_contentsからhtmlのDOM要素を取得する

これは私がURLからHTMLデータを取得する方法である:

$url = 'http://example.com'; 
$content = file_get_contents($url); 

HTMLは次のようになります。

<table class="space"> 
    <thead></thead> 
    <tbody> 
     <tr> 
     <td class="marsia">1</td> 
     <td class="mars"> 
      <div>Mars</div> 
     </td> 
     </tr> 
     <tr> 
     <td class="earthia">2</td> 
     <td class="earth"> 
      <div>Earth</div> 
     </td> 
     </tr> 
    </body> 
</table> 

我々はjQueryの中で行うようにPHPでDOM要素をsearhする方法はありますか?だから、私は値1,2、(最初のtd)にアクセスし、2番目のtdの中のdivの値にアクセスできるようにする。

何か

よう

a)は、各TR年代初のTDの値」と「第二のTD内側のdivの値を」を返し、tbodyの内部にそのテーブル内のクラスの名前空間

B)、とテーブルのHTMLを検索

です。 1と火星、2と地球。

+0

[DOMDocument](http://php.net/manual/en/class.domdocument.php)を使用してHTMLを解析します。 – Barmar

答えて

0

たとえば、DOM extensionを使用します。そのDOMXPathクラスは、この種のタスクに特に役立ちます。

簡単にこのようなXPath式と記載されている条件を設定することができる:

//table[@class="space"]//tr[count(td) = 2]/td 

から//table[@class="space"]"space"ストリングに等しいclass属性値を有する文書から全てtable要素を選択します。 - //tr[count(td) = 2]は、正確に2つのtd子要素を持つすべてのtr要素を選択します。 - /tdは、td要素を表します。

実装例:

$html = <<<'HTML' 
<table class="space"> 
    <thead></thead> 
    <tbody> 
     <tr> 
     <td class="marsia">1</td> 
     <td class="mars"> 
      <div>Mars</div> 
     </td> 
     </tr> 
     <tr> 
     <td class="earthia">2</td> 
     <td class="earth"> 
      <div>Earth</div> 
     </td> 
     </tr> 
     <tr> 
     <td class="earthia">3</td> 
     </tr> 
    </tbody> 
</table> 
HTML; 

$doc = new DOMDocument; 
$doc->loadHTML($html); 

$xpath = new DOMXPath($doc); 

$cells = $xpath->query('//table[@class="space"]//tr[count(td) = 2]/td'); 

$i = 0; 
foreach ($cells as $td) { 
    if (++$i % 2) { 
    $number = $td->nodeValue; 
    } else { 
    $planet = trim($td->textContent); 
    printf("%d: %s\n", $number, $planet); 
    } 
} 

出力

1: Mars 
2: Earth 

上記コードはそれとして、サンプルなく実用の指示と考えることになっています非常にスケーラブルではありません。論理は、XPath式が各行に対して正確に2つのセルを選択するという事実に拘束されます。実際には、例えば、行を選択したい、それらを反復処理し、ループの中に余分な条件を出してもよい:

$rows = $xpath->query('//table[@class="space"]//tr'); 

foreach ($rows as $tr) { 
    $cells = $xpath->query('.//td', $tr); 

    if ($cells->length < 2) { 
    continue; 
    } 

    $number = $cells[0]->nodeValue; 
    $planet = trim($cells[1]->textContent); 
    printf("%d: %s\n", $number, $planet); 
} 

DOMXPath::query()をチェックし、その後、現在の行に対するXPath式($tr)と呼ばれています返されたDOMNodeListに少なくとも2つのセルが含まれている場合残りのコードは簡単です。


SimpleXML拡張機能も使用できます。これはXPathもサポートしています。しかし、拡張子はDOMの拡張機能に比べてずっと柔軟性がありません。

巨大なドキュメントの場合は、XMLReaderなどのSAXベースのパーサーに基づく拡張を使用してください。

関連する問題