我尝试使用xpath来获取PHP中类名为“post”的所有元素,但它不起作用。我应该提到,a元素是由一个短代码输出的,所以我甚至不确定在这个场景中是否工作。我不知道为什么,但它在$items中返回长度为0的DOMNodeList对象。我还想得到post_title,它是a元素中的文本,所以我使用的是$post_title = $item->nodeValue,但我不确定这是否有效。任何帮助都将不胜感激。
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行。我需要为每个项目获取与此模式匹配的所有元素。
<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>发布于 2021-07-22 10:03:36
如果您首先运行以下“原样”,您应该在textarea中看到修改后的文档的表示,然后,如果您启用了第二个URL并运行它(没有方案),就会出现一个问题。
这与您的代码基本相同--如果没有看到正确的url,很难说问题在哪里,因为您有两个未声明和未知的方法get_page_by_title和get_rating。
从下面的代码可以看出,不需要在DOMDocument循环中调用一个新的foreach对象来简单地添加一个新节点。
<?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() );
}
?>https://stackoverflow.com/questions/68482440
复制相似问题