3

以下から2番目のulのliタグだけを抜き出そうとしています。残念ながら、html に役立つクラスや ID はありません。

<ul>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
</ul>

<ul>
    <li>Some more text</li>
    <li>Some more text</li>
    <li>Some more text</li>
</ul>

私は試しました(実際にはいくつかのこと):

    $ul = $xpath->query('//ul')->item(1);
    $query = '/li';
    $lis = $xpath->evaluate($query, $ul);

これで 2 番目の ul が得られると考えて、そこから抽出できます。それは私に 2 番目の ul の html を取得しますが、明らかに `->evaluate? で何かを誤解していますか? 私のliは、2番目のulからだけでなく、すべてのliだからです。

4

2 に答える 2

6

XPath を使用して直接アクセスできます。

$xpath->query('//ul[2]/li');

例:

$html = <<<EOF
<ul>
    <li>Some text</li>
    <li>Some text</li>
    <li>Some text</li>
</ul>

<ul>
    <li>Some more text</li>
    <li>Some more text</li>
    <li>Some more text</li>
</ul>
EOF;

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

$selector = new DOMXpath($doc);

// iterate through them...
foreach($selector->query('//ul[2]/li') as $li) {
    echo $li->nodeValue . PHP_EOL;
}

于 2013-05-04T09:34:58.307 に答える
2

(質問のように) context-node を使用する場合は、前にドット (xpath のドットは現在のノード) を追加して、ルートまでではなく、context-node に対して相対的にします。

$query = './li';
          #
$lis = $xpath->evaluate($query, $ul);

または、前にスラッシュなしで:

$query = 'li';              
$lis = $xpath->evaluate($query, $ul);

参照 / 比較:特定の要素の下の XPath で検索します

于 2013-05-04T09:42:09.207 に答える