【问题标题】:PHP simple html dom - can't traverse unhelpful markupPHP简单的html dom - 不能遍历无用的标记
【发布时间】:2014-01-28 14:34:09
【问题描述】:

我正在使用 simple_html_dom 尝试从看起来像这样的表中获取标题和(可能多次)时间:

    <tr></tr>
    <tr>
    <td class="title">Some title</td>
    </tr>
    <tr>
    <td class="time">11:00</td>
    </tr>
    <tr></tr>
    <tr> 
    <td class="title">Another title</td>
    </tr>
    <tr>
    <td class="time">16:00 22:00</td>
    </tr>
    <tr>
    <td class="time">21:00</td>
    </tr>
    // And so on

我的 simple_html_dom 目前是这样设置的:

foreach($html->find('tr') as $film) {

   $title = $film->find('td.title',0)->plaintext;
   $time = $film->find('td.time',0)->plaintext;

   if ($time) { 

     $showtimes .= ' '.$time;
   }

  if ($title) { 

    echo $title

    if (!empty($showtimes)) {

      echo $showtimes;          
    }   
 }

一个标题可能有重复(这没关系),任何单个标题都可能有多次。

长话短说,我可以到达那里,但它很混乱,而且我没有得到一个可以以简单方式使用的带有相关时间的标题的整洁列表 - 即转储全部存入数据库。

有什么建议吗?

【问题讨论】:

    标签: php dom simple-html-dom


    【解决方案1】:

    第一步是遍历所有td.titles。对于其中的每一个,td.times 将始终位于以下tr 中,因此:

    foreach($html->find('td.title') as $td) {
      $title = $td->text();
      $times = array();
      while(($tr = $td->parent->next_sibling()) && ($td = $tr->find('td.time', 0))){
        $times[] = $td->text();
      }
      var_dump($title, $times);
    }
    

    【讨论】:

    • 完美——正是我所需要的。
    • Enissay - 感谢您让我开始!
    【解决方案2】:

    真是一个很棒的 HTML 代码:>

    试试:

    foreach($html->find('tr td') as $row) {
    
        if ($row->class == 'title') {
            echo "<br>".$row->plaintext;
        }
        elseif ($row->class == 'time') {
            echo "\t".$row->plaintext;
        }
    }
    

    输出

    Some title  11:00
    Another title   16:00   21:00
    

    您还可以使用在找到class="title" 时更改的标志

    我希望这能给你一些想法:)

    【讨论】:

    • 超级 - 感谢您的意见!我也刚刚意识到主要的问题是知道我什么时候已经到达时间 td 的尽头,并获得一个新的标题 td,因为我需要在继续之前提交所有这些 deets。我想一个标志检查下一行是否是标题 td 而不再是时间 td 会起作用?
    • 嗯,我将如何创建一个标志来容纳多个标题?如果我在 $title 循环中回显 $time,它会工作,除了最后一个标题。时间的复杂性是时间 td 也可能有多个条目(在同一个节点中),这可能是以下时间行的重复项。所以我一直在花时间,从中创建一个数组,删除重复项,然后按时间排序。
    • @MetaHeavies,例如在phpfiddle.org 上发布您的代码的 sn-p 以查看清楚 xD
    • phpfiddle.org/main/code/fix-4z5 谢谢 Enissay - 问题是我在循环中的哪个位置粘贴数据库代码以获取每个块的标题和时间并将其放入新表中......
    • 问题出在分组上。这并不能解决这个问题。
    猜你喜欢
    • 2013-08-26
    • 2012-11-06
    • 2015-09-30
    • 2020-04-18
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多