【问题标题】:PHP DOMXPath loop through search and find child div valuePHP DOMXPath 循环搜索并找到子 div 值
【发布时间】:2018-01-03 22:00:19
【问题描述】:

我正在将外部 HTML 内容加载到这样的变量中:

$content = file_get_contents('http://localhost');

页面有一组<ul>的循环,如下所示:

<ul class="items-list">
<li>Title1</li>
<li>Description1</li>
<li>Location1</li>
</ul>
<!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
<a href="#">
<div class="item-price">£10</div>
<a/>

<ul class="items-list">
<li>Title2</li>
<li>Description2</li>
<li>Location2</li>
</ul>
<!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
<a href="#">
<div class="item-price">£15</div>
</a>

<ul class="items-list">
<li>Title3</li>
<li>Description3</li>
<li>Location3</li>
</ul>
<!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
<a href="#">
<div class="item-price">£20</div>
</a>

<ul class="items-list">
<li>Title4</li>
<li>Description4</li>
<li>Location4</li>
</ul>
<!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
<a href="#">
<div class="item-price">£25</div>
</a>

我有以下代码,它使用 DOMXPath 搜索所有项目列表 UL,然后我可以循环并回显它。

$dom = new DomDocument();
$dom->loadHTML($content);
$xpath = new DOMXPath($dom); 
$items = $xpath->query("//ul[@class='items-list']"); 

foreach ($items as $node) { 
  echo $node->textContent;
}

这项工作非常完美。但是,我需要帮助显示每个循环的价格,这些循环来自名为 item-price 的 div 类,它在 UL 之后但不是紧随其后。

我该怎么做?

【问题讨论】:

    标签: php domdocument domxpath


    【解决方案1】:
    foreach ($items as $node) { 
      echo $node->textContent;
      $div = $xpath->query('.//following::div[@class="item-price"][1]', $node); 
      echo $div[0]->nodeValue ."\n\n";
    }
    

    demo

    【讨论】:

    【解决方案2】:

    使用跟随兄弟轴

    $xpath->query("//ul[@class='items-list']/following-sibling::div[@class='item-price']"); 
    

    【讨论】:

    • 这似乎不起作用。返回完全为空,没有结果。
    【解决方案3】:

    使用结合following-sibling 运算符的原始查询也许就足够了。

    define('BR','<br />');
    
    $strhtml='<ul class="items-list">
        <li>Title1</li>
        <li>Description1</li>
        <li>Location1</li>
        </ul>
        <!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
        <div class="item-price">£10</div>
    
        <ul class="items-list">
        <li>Title2</li>
        <li>Description2</li>
        <li>Location2</li>
        </ul>
        <!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
        <div class="item-price">£15</div>
    
        <ul class="items-list">
        <li>Title3</li>
        <li>Description3</li>
        <li>Location3</li>
        </ul>
        <!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
        <div class="item-price">£20</div>
    
        <ul class="items-list">
        <li>Title4</li>
        <li>Description4</li>
        <li>Location4</li>
        </ul>
        <!-- OTHER CONTENT HERE BETWEEN THE UL AND THE PRICE DIV -->
        <div class="item-price">£25</div>';
    
    
        $dom = new DomDocument();
        $dom->loadHTML( $strhtml );
        $xpath = new DOMXPath( $dom ); 
        $items = $xpath->query("//ul[@class='items-list'] | //ul[@class='items-list']/following-sibling::div[@class='item-price']"); 
        if( $items && $items->length > 0 ){
            foreach ( $items as $node ) { 
                echo $node->textContent . BR;
            }
        }
    

    以上输出

    Title1 Description1 Location1 
    £10
    Title2 Description2 Location2 
    £15
    Title3 Description3 Location3 
    £20
    Title4 Description4 Location4 
    £25
    

    鉴于对 html 内容的更改,需要对 XPath 查询进行少量修改,因为包含价格的 div 不再是直接兄弟 - 尽管它可能是。

    $items = $xpath->query("//ul[@class='items-list'] | //ul[@class='items-list']/following::div[@class='item-price']");
    

    【讨论】:

    • 似乎不起作用,它应该在同一个 $node->textContent 中吗?我试过 print_r($node->textContent); [nextSibling] =>(省略对象值)
    • 啊 - 删除 BR ~ 那是一个常数 define('BR','&lt;br /&gt;'); - 可能是原因
    • 感谢 RamRaider,但似乎
      £10
      内,所以实际上看起来像这样
      £10
      因为这个href它不起作用。有没有办法解决这个问题?
    • 如果我删除 a 标签然后它工作,但与 A 标签它不工作。我需要它来处理 A 标签。有什么想法吗?
    • 您能否更新您的问题以反映实际数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    相关资源
    最近更新 更多