0

下部の編集を参照してください。

XPath を使用してサイトからデータをスクレイピングしています。foreach() loopsおそらく使用している が多すぎて、より簡単な方法で階層をたどることができるのではないかと思っています。使用しているクエリが多すぎる可能性があり、1 つだけを使用するより良い方法があるかもしれない

ヒエラルキーはこんな感じ。

<ul class='item-list'>
    <li class='item' id='12345'>
        <div class='this-section'>
            <a href='http://www.thissite.com'>
                <img src='http://www.thisimage.com/image.png' attribute_one='4567' attribute-two='some-words' />

        </div>
        <small class='sale-count'>Some Number</small>
    </li>
    <li class='item' id='34567'>
    <li class='item' id='48359'>
    <li class='item' id='43289'>
</ul>

だから私は次のことをしました:

$dom = new DOMDocument;
@$dom->loadHTMLFile($file);
$xpath = new DOMXPath($dom);

$list = $xpath->query("//ul[@class='item-list']/li");

foreach($list as $list_item)
{
$item['item_id'][] = $list_item->getAttribute('id');

$links = $xpath->query("div[@class='this-section']//a[contains(@href, 'item')]", $list_item);

foreach($links as $address)
{
    $href = $address->getAttribute('href');
    $item['link'][] = substr($href, 0, strpos($href, '?'));
}

$other_data = $xpath->query("div[@class='this-section']//*[@attribute-one]", $list_item);

foreach($other_data as $element)
{
    $item['cost'][] = $element->getAttribute('atribute-one');
    $item['category'][] = $element->getAttribute('attribute-two');
    $item['name'][] = $element->getAttribute('attribute-three');        

}

$sales = $xpath->query(".//small[@class='sale-count']", $list_item);

foreach($sales as $sale)
    $item['sale'][] = substr($sale->textContent, 0, strpos($sale->textContent, ' '));
 }

階層を下って作業するには、常に再クエリを実行する必要がありますか?それとも、これを達成するためのより簡単な方法はありますか?

編集 だから、私は実際にあまりにも多くの foreach ループを使用しているようです。取り出すたびに、大量のメモリを節約できます。だから私の質問はなります。

親要素 (この場合は<li>) がある場合、結果を再クエリしてループせずに要素と属性を選択する方法はありませんか? これらの xpath サブクエリと foreach ループをできる限り排除する必要があります。

4

1 に答える 1

0

もちろん、代わりに使用できますDOMElement::getElementsByTagName()

$images = $list_item->getElementsByTagName( 'img');

どちらがより効率的かについては、ベンチマークする必要があります。相対 XPath クエリ、または<li>のノード ツリーの事前順序走査の速度比較があります。

于 2012-11-08T03:24:21.590 に答える