0

请参阅底部的编辑:

我正在使用 XPath 从站点中抓取一些数据。我想知道我是否可能使用了太多foreach() loops,并且可以以更简单的方式遍历层次结构。我觉得我可能使用了太多查询,并且可能有更好的方法只使用一个

层次结构看起来像这样。

<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 回答