2017-09-12 3 views
0

curlリクエスト内に、以下の構造を持つhtmlテーブルがあります。ここでは、空のクラスを持つspan要素を含むテーブル行のみを抽出し、class = "subcomponent"を持つ行は抽出しません。 空のクラスを持つ要素を見つけるのにXpathをうまく試しましたが、VersionとPartnumberを含む特定のノード全体を取得するにはどうしたらいいですか? ありがとうございます。 PHP DOM/xpathがelemetスパンクラスの値を確認する

<table> 
... 
<tbody> 
    <tr> 
     <td></td> 
     <td></td> 
     <td> 
      <span class="">Product</span> 
     </td> 
     <td>Version</td> 
     <td>Partnumber</td> 
    </tr> 
    <tr> 
     <td></td> 
     <td></td> 
     <td> 
      <span class="subcomponent">Component</span> 
     </td> 
     <td>Version</td> 
     <td>Partnumber</td> 
    </tr> 
</tbody> 

私のPHPコード

$doc = new DOMdocument(); 
libxml_use_internal_errors(true); 
$doc->loadHTML($page); 
$doc->saveHTML(); 
$xpath = new DOMXpath($doc); 
$query ='//span[@class=""]'; 
$entries = $xpath->query($query); 

foreach ($entries as $entry) { 
    echo $entry->C14N(); 
} 

答えて

2

をフェッチ子供0123を持っているすべての<tr>のタグを選択することで

$sxml = simplexml_load_string('<table>...</table>'); 

$rows = $sxml->xpath('//tr[td/span[@class=""]]'); 

foreach ($rows as $row) { 
    echo "Version: ", $row->td[3], ", Partnumber: ", $row->td[4]; 
} 

のXPath作品:自身がSimpleXMLをを使用して表の行は、次のものを使用することができますは、それ自身がブランククラスの子<span>を持っています。

ループでは、各行の子セルに番号でアクセスする必要があります。これは、サンプルに他の方法でラベルが付けられていることを示していないためです。私はテーブル構造があまり頻繁に変更されないと仮定しているので、それはうまくいくはずです。

例としてhttps://eval.in/860169を参照してください。

代替のDOMDocumentバージョン

あなたは必ずしもうまく形成されない完全なWebページを、フェッチしている場合、あなたはあなたの最初の例を持っているようDOMDocumentを使用する必要があります。これは、子要素にアクセスするには少し少ないきれいなのですが、以下のようなものは動作します:

$doc = new DOMdocument; 
libxml_use_internal_errors(true); 
$doc->loadHTML($page); 
$xpath = new DOMXpath($doc); 
$rows = $xpath->query('//tr[td/span[@class=""]]'); 

foreach ($rows as $row) { 
    $cells = $row->getElementsByTagName('td'); 

    $version = $cells->item(3)->nodeValue; 
    $partNumber = $cells->item(4)->nodeValue; 

    echo "Version: {$version}, Part Number: {$partNumber}", PHP_EOL; 
} 

は、私は次のXPath式を使用しますhttps://eval.in/860217

+0

私はcurlコマンドでテーブルを取得し、それを$ pageに保存しました。私はあなたのコードを使ってその作業をどうしたらいいですか? – Mike

+0

ページが整形式の場合は、最初の行の代わりに '$ sxml = simplexml_load_string($ page);'を使うだけでよい。私はDOMDocumentを使って答えを編集しましたが、うまくいかない場合もあります。 – iainn

+1

ありがとうございます - 代わりのDOMDocumentアプローチがうまくいきます! – Mike

-1

ドキュメントで、次の要素が必要な場合は、XPathの中following-siblingを使用しています。以下は、アクセスするために、現在の要素の後に二<td>(バックスパンラウンド<td>要素へ行くために...の使用を注意してください)...

//span[@class=""]/../following-sibling::td[2] 

が与える..

<td>Partnumber</td> 
-1

を参照してください:

私に与え
//td[text()="Version"] | //td[text()="Partnumber"] 

Element='<td>Version</td>' 
Element='<td>Partnumber</td>' 
Element='<td>Version</td>' 
Element='<td>Partnumber</td>' 
関連する問題