【问题标题】:Traverse DOM tree with foreach loop使用 foreach 循环遍历 DOM 树
【发布时间】:2013-03-20 14:30:35
【问题描述】:

在使用 Simple HTML DOM Parser 遍历 DOM 树时需要帮助。如果有人可以花点时间看看它是如何工作的,那么如果我弄明白了,知识渊博的 PHP 编码人员应该很快就能弄明白。我被困的地方是从我朋友的俄罗斯篮球网站上的一个 div 中获取文章。例如,博客 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;

这应该返回到 div 'news',然后再到 div 'img' 再到 div 'title'。那应该得到第一个 div=title 的链接。但我什么也得不到。有没有办法做到这一点?

【问题讨论】:

    标签: php html parsing simple-html-dom


    【解决方案1】:

    试试这个:

    $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;
       }
    }
    

    【讨论】:

    • 没什么。源代码为空。你能告诉我吗?你说的是foreach项目类,获取第一个链接,对吗?然后将输出数组设置为该标题“a”链接并在该标题 div 内循环?我现在正在与数组作斗争......
    • 呃,它是空的。因为没有 echo 语句。您可以使用 echo 语句进行更新吗?我会回显输出[$title][]吗?
    • var_dump($output);看看它到底包含什么。
    • 这是它给出的格式:array(1){["the title"]=>array(1){[0]"and the first article"}}array(1) 然后对于数组 2,它显示 [0] 并将 [1] 附加到它。第二个相同,所以它重复和三次(如果那是一个词)等等。
    • 你的问题是关于Simple HTML Dom Parser,剩下的细节留给你注意,很明显你需要相应的PHP知识才能使用结果。
    【解决方案2】:

    这是不使用数组的方法!

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

    得到了想要的结果!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2019-07-05
      • 2011-09-15
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多