2017-10-22 11 views
1

リモートWebページからデータを解析しようとしています。 curlを使用してそれを取得し、loadHTML()を使用してDOMDocument()を作成します。Xpathクエリですべての子が返されませんか?

として、私はクラス名で選択したいの問題に遭遇すると、いくつかのソリューションを試みたが、最も受け入れ方法は、私はXPathクエリを使用することのようです:これはライン上のコンテナを見つけ

$classname = 'content-container-primary character-list'; 
$xpath = new DOMXPath($dom); 
$results = $xpath->query("//*[@class='" . $classname . "']"); 

私は直接$classname = 'list-group media-list media-list-stream m-t-0';を使用してULを検索でき

<div class="content-container-primary character-list"> 
    <ul class="list-group media-list media-list-stream m-t-0"> 
     <li class="list-group-item p-a"> 
      <span class="header-buttons"></span> 
      <span class="header-text"></span> 
     </li> 
     <li class="list-group-item p-a visible-xs"> 
      <div class="row sw-ad-mrec mobile"></div> 
     </li> 
     <li class="media list-group-item p-a collection-char-list"> 
      <div class="row"> 
       <div class="col-xs-6 col-sm-3 col-md-3 col-lg-2"> 
       </div> 
      </div> 
     </li> 
    </ul> 
</div> 

、私は以来、彼らはそのULクラスのクラス名ではなくIDを使用していることを心配:似ているペーストビンリンクされたテキスト(わかりやすくするために省略)の134名前はあまり具体的ではないようです他の場所で再利用される可能性があります。このULをクラス '文字リスト'のDIVの子として見つけると、私は正しいオブジェクトを見ていると確信します。

「col-xs-6 col-sm-3 col-md-3 col-lg-2」のすべてのアイテムが見つかりました。私はこの名前がプログラムで生成されているかどうか分かりません。私はそれに頼りたくないのでxPathを検索しないで、代わりに<li class="media list-group-item p-a collection-char-list">コンテナの子として扱います<ul class="list-group media-list media-list-stream m-t-0">コンテナは私の$ results-> item(0)の子です...これまでのところ、私がオブジェクトをチェックすると、ULの子が正しく見つかったと分かります。一度見つけたら、それを一時的なDOMDocumentにコピーするので、より多くのxpathを検索できます。

$temp_dom = new DOMDocument(); 
foreach($results->item(0)->childNodes as $n) { 
    if ($n->nodeType === 1) { 
     if($n->getAttribute("class") == 'list-group media-list media-list-stream m-t-0'); 
      $temp_dom->appendChild($temp_dom->importNode($n,true)); 
     } 
    } 
} 

これまでのところとても良いです。今、私は私が私が欲しいULを持って自信を持っていますが、私がしようとしたとき:

$classname = 'media list-group-item p-a collection-char-list'; 
$xpathUL = new DOMXPath($temp_dom); 
$result2 = $xpathUL->query("//*[@class='" . $classname . "']"); 

私は、のDOMNodeListオブジェクト([長さ] => 0)空の結果を取得します。

私が試み調査:最初の2つのLIオブジェクトを示すが、第三ない

$nodes = array(); 
$nodes = $temp_dom->getElementsByTagName('li'); 

foreach ($nodes as $node) { 
    echo $node->getAttribute("class").'<br>'; 
} 

を。

元の$domオブジェクトに戻って、興味のあるliのクラス名を使用してxpath検索を実行すると、結果内に表示されます。

私はどこから外れているのか不明です。私はこのソリューションはかなりclunkyだと知っているが、それは私の目的のために十分に実行されます。

私はリモートページの形式を制御することはできず、その形式をそのまま使用する必要があります。

完全なサンプルはthis pastebin linkで入手できます。

+1

を-2 "class items"。*これは試しましたか?/* [@ class = 'col-xs-6 col-sm-3'/* [@ class = 'メディアリスト - グループ項目pa collection-char-list']/* [@ class = 'row'] col-md-3 col-lg-2 '] '中にdivクラスの行があることに気付きましたが、私はあなたのコードをテストできないのでPHPの人ではありません。 – derloopkat

+0

@derloopkatこれは私が探しているものを正確に抽出します。共有していただきありがとうございます。投稿されたコードがうまくいかない理由はまだ分かりませんが、あなたのコメントを答えに移すと、幸いなことに大きな緑色のチェックマークが付けられます。 – Stephen

+0

ここまでうれしい、答えに移動 – derloopkat

答えて

0

構造の途中にdivクラス「行」があります。

あなたは、より高度なXPathクエリ文字列試みることができる:COL-XS-6 COL-SM-3 COL-MD-3 COL-LG "私は何を見つけたいことのすべてである" *

//*[@class='media list-group-item p-a collection-char-list']/*[@class='row']/*[@class='col-xs-6 col-sm-3 col-md-3 col-lg-2'] 
関連する問題