当前位置: 首页 > 知识库问答 >
问题:

使用foreach循环遍历DOM树

谢哲瀚
2023-03-14

需要帮助通过简单的HTML DOM解析器遍历DOM树。如果有人能花点时间来看看它是如何工作的,那么如果我能理解的话,知识渊博的PHP程序员应该能很快理解它。我陷入困境的地方是从我朋友的俄罗斯篮球网站上的一个部门那里得到文章。例如,以下是博客div的外观:

<div id='columnsList'><div class='item'>
  <div class='title'><a href='/ru/columns/1'>Колонка Римантаса Григаса</a></div>
  <div class='img'> <img src='/files/columns/grigas.jpg'></div>
  <div class='news'>
    <a href='/ru/news/3174'>Римантас Григас: о пути на Евробаскет (0)</a>
    <a href='/ru/news/1486'>Римантас Григас: об уходе из УГМК и о ближайших планах (1)</a>
    <a href='/ru/news/731'>О горниле «Финала восьми» Евролиги (0)</a>
    <a href='/ru/news/421'>О новом назначении и о сборной Украины (0)</a>
    <a href='/ru/news/299'>О настоящем примере для подражания (0)</a>
  </div><div style='clear:left;'></div> 
  </div>
  <div class='item'>
  <div class='title'><a href='/ru/columns/2'>Колонка Кирилла Натяжко</a></div>
  <div class='img'> <img src='/files/columns/nati.jpg'> </div>
  <div class='news'>
    <a href='/ru/news/3618'>Кирилл Натяжко: "Хорватов мы не боимся" (2)</a>
    <a href='/ru/news/3113'>Кирилл Натяжко: "Необоснованная критика подарила мне дополнительную мотивацию" (1)</a>
    <a href='/ru/news/2454'>Кирилл Натяжко: "Мне нечего бояться, пускай лучше боятся меня!" (6)</a>
    <a href='/ru/news/325'>Доброе утро, страна! (1)</a>
  </div><div style='clear:left;'></div> 
</div>
<div class='news'>
//More divs and links

这就是我如何拉出单个“a”链接并显示它们的方法,但我想做的是获取所有链接的div标题,基本上对它们进行分类,而不是将所有内容都排成一行。我不知道如何在foreach循环中完成它。

foreach ($html->find('div[class=item] a[href*=news]') as $col){
   echo $col.'<br>';
}

我试着加上第一个回声:

echo $col->parent()->prev_sibling()->prev_sibling()->a;

这应该回到“新闻”栏目,然后再升级到“img”栏目,再升级到“title”栏目。应该得到第一个div=title的链接。但我什么也得不到。有办法做到这一点吗?

共有2个答案

东方权
2023-03-14

这是一种不使用数组的方法!

foreach ($html->find('div[class=item]') as $item){
    echo $item->children(0)->plaintext;
    foreach ($item->find('a[href*=news]') as $col){
      echo $col.'<br>';
    }
}

达到了预期的效果!

宰父嘉胜
2023-03-14

试试这个:

$output = array();
foreach($html->find('div[class=item]' as $item) {
   $title = $item->find('div[class=title] a', 0)->innertext;
   $output[$title] = array();
   foreach($item->find('div[class=news] a') as $link) {
       $output[$title][] = $link->innertext;
   }
}
 类似资料:
  • 本文向大家介绍MongoDB数据库forEach循环遍历用法,包括了MongoDB数据库forEach循环遍历用法的使用技巧和注意事项,需要的朋友参考一下 MongoDB数据库forEach语句循环遍历功能是非常常用的一个功能。 采用foreach循环遍历,并每次循环允许执行一次回调函数。 此外,foreach循环遍历是for循环的一种扩展,对比同浏览器端的forEach用法是一致的。 示例如下:

  • 本文向大家介绍C#使用foreach循环遍历数组完整实例,包括了C#使用foreach循环遍历数组完整实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#使用foreach循环遍历数组的方法。分享给大家供大家参考,具体如下: 更多关于C#相关内容感兴趣的读者可查看本站专题:《C#遍历算法与技巧总结》、《C#程序设计之线程使用技巧总结》、《C#操作Excel技巧总结》、《C#中XML文件

  • 问题内容: 我可以在varArgs上使用还是在varArgs上使用? 问题答案: 变量参数的行为与数组相似,因此您可以使用来获取变量变量中的一个: 您可以使用以下方法遍历它们:

  • 我有一个页面看起来像这样: 每个info类div的结构都是相同的,我希望能够遍历文档,对于每个具有info类的div,将各个组件解析为数组或单个变量,以便以某种人类可读的格式输出数据,如csv文件或HTML表。 我已经尝试使用DOMDocument方法,并使用getElementByTagName提取每个标记的内容,但是因为div包含多种标记类型(h3,a,span),所以我还不知道如何完成我要做

  • 问题内容: 我正在尝试编译以下代码: 我在for行中看到一条错误消息: 该方法返回一个(但在这种情况下,返回的结构)。 是我为应用程序创建的枚举(在另一个类文件-中)。 当我在中创建具有相同结构的foreach循环时,我没有遇到此问题。 我究竟做错了什么? 问题答案: 一种更有效的方法: 如果有可能,请定义“ getData”,以便您不需要强制转换。

  • 我得到一个使用下面的代码的锚的列表,然后我想去每个链接。我想出了下面的代码,但是在第一个循环之后,我得到了以下异常 org.openqa.selenium.staleElementReferenceException:过时元素引用:元素未附加到页面文档(会话信息:Chrome=55.0.2883.87) 有没有办法做到这一点,而不需要每次返回页面?