首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用xpath在PHP中获得具有类名的所有<a>元素,并在每个元素下添加一个<p>标记?

如何使用xpath在PHP中获得具有类名的所有<a>元素,并在每个元素下添加一个<p>标记?
EN

Stack Overflow用户
提问于 2021-07-22 09:29:34
回答 1查看 52关注 0票数 0

我尝试使用xpath来获取PHP中类名为“post”的所有元素,但它不起作用。我应该提到,a元素是由一个短代码输出的,所以我甚至不确定在这个场景中是否工作。我不知道为什么,但它在$items中返回长度为0的DOMNodeList对象。我还想得到post_title,它是a元素中的文本,所以我使用的是$post_title = $item->nodeValue,但我不确定这是否有效。任何帮助都将不胜感激。

代码语言:javascript
复制
    function add_rating_below_search_result_post_title(){
        $dom = new DomDocument;
        $dom->loadHTMLFile("example.com");
        $xpath = new DomXPath($dom);    
        $items = $xpath->query("//a[@class='post-title']");
    
        foreach ($items as $item) {
            $post_title = $item->nodeValue;
            $post_id = get_page_by_title($post_title, OBJECT, 'post');
            
            $rating_content = get_rating($post_id);
            
            $doc = new DOMDocument();
            $rating = $doc->createElement("p", $rating_content);
          
            $item->appendChild($rating);        
        }
    }

这是一个项目的HTML示例。HTML中有多个类似的项。我想要的a元素是从底部开始的第6行。我需要为每个项目获取与此模式匹配的所有元素。

代码语言:javascript
复制
<div class="cl-layout__item cl-layout__item--id-1234">
<div class="cl-layout__item-spacing">
<div class="cl-template cl-template--post cl-template--id-1234 cl-template--image-top">
<div class="cl-element cl-element-featured_media cl-element--instance-1234  cl-element-featured_media--sizing-natural">
<a class="cl-element-featured_media__anchor" href="https://www.example.com/item1/"><img data-pin-title="Item Search" class="cl-element-featured_media__image" src="https://cdn.shortpixel.ai/spai/w_300+q_lossless+ret_img+to_webp/https://www.example.com/wp-content/uploads/2020/07/Item1-300x300.jpg" data-spai="1" alt="Item 1" data-pin-nopin="true" data-spai-upd="339">
<noscript data-spai="1"><img data-pin-title="Item Search"  class="cl-element-featured_media__image"  src="https://cdn.shortpixel.ai/spai/q_lossless+ret_img/https://www.example.com/wp-content/uploads/2020/07/Item1-300x300.jpg" data-spai-egr="1"  alt="Item 1"  />
</noscript>
</a>
</div>
<div class="cl-element cl-element-section cl-element--instance-1222 ">
<h4 class="cl-element cl-element-title cl-element--instance-1333 ">
<a class="post-title" href="https://www.example.com/item1/">Item 1 post title</a>
</h4>
</div>
</div>
</div>
</div>
EN

回答 1

Stack Overflow用户

发布于 2021-07-22 10:03:36

如果您首先运行以下“原样”,您应该在textarea中看到修改后的文档的表示,然后,如果您启用了第二个URL并运行它(没有方案),就会出现一个问题。

这与您的代码基本相同--如果没有看到正确的url,很难说问题在哪里,因为您有两个未声明和未知的方法get_page_by_titleget_rating

从下面的代码可以看出,不需要在DOMDocument循环中调用一个新的foreach对象来简单地添加一个新节点。

代码语言:javascript
复制
<?php
    $url='https://www.php.net/manual/en/class.domdocument.php';
    #$url='php.net/manual/en/class.domdocument.php';
    
    
    libxml_use_internal_errors( true );
    $dom=new DOMDocument;
    $dom->validateOnParse=false;
    $dom->recover=true;
    $dom->strictErrorChecking=false;
    $dom->loadHTMLFile( $url );
    libxml_clear_errors();
    
    
    $xp=new DOMXPath( $dom );
    $expr='//a[@class="methodname"]';
    
    $col=$xp->query( $expr );
    if( $col->length > 0 ){
        foreach( $col as $node ){
            $linktext=$node->nodeValue;
            $p=$dom->createElement('p','------BANANA BANANA BANANA-------');
            $node->appendChild($p);
        }
        
        printf('<textarea cols=100 rows=20>%s</textarea>',$dom->saveHTML() );
    }
?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68482440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档