【问题标题】:How to scrape using simple html dom when no hierarchy in HTML当 HTML 中没有层次结构时如何使用简单的 html dom 进行抓取
【发布时间】:2012-10-26 11:59:56
【问题描述】:
  <td class="cinetime">
    <div>Screen: 3</div>
    <br clear="all">
    <span>1:00</span>
    <span>11:00</span>
    <span>13:00</span>
    <span>15:00</span>
    <br clear="all">
    <div>Screen: 4</div>
    <br clear="all">
    <span>12:05</span>
    <span>14:05</span>
    <span>16:05</span>
    <span>18:05</span>
    <span>20:05</span>
    <div>Screen: 3 (3D)</div>
  </td>

上面是我正在编写的 HTML。

我想分别为screen 3Screen 4获取&lt;span&gt;中的数据。

这是我下面的代码,但它从所有&lt;span&gt;s 中获取数据

foreach($cinema->find("td.cinetime span") as $times) {
    echo $times->plaintext;
}

【问题讨论】:

标签: php simple-html-dom


【解决方案1】:

类似这样的:

$dom = new simple_html_dom();
$dom->load($source);


$cinetime = $dom->find('.cinetime',0);

$screens = array();
$screenName = '';

foreach($cinetime->children() as $elem){
    if($elem->tag == 'div'){
        $screenName = $elem->innertext;
    } else
    if($elem->tag == 'span'){
        $screens[$screenName][] = $elem->innertext;
    }
}
print_r($screens);

产生这个:

Array
(
[Screen: 3] => Array
    (
        [0] => 1:00
        [1] => 11:00
        [2] => 13:00
        [3] => 15:00
    )

[Screen: 4] => Array
    (
        [0] => 12:05
        [1] => 14:05
        [2] => 16:05
        [3] => 18:05
        [4] => 20:05
    )

)

?

【讨论】:

  • 这很棒,'$elem->tag' 是我一直在寻找的关键。我投票支持 kasp3r 指出这一点。非常感谢你们
【解决方案2】:

您需要检查 td.cintime 中的所有元素并检查文本是否是您需要的(例如 Screen: 3),然后检查其他元素是否为 span,然后将其放入某个数组中,直到获得另一个 div。这意味着一个屏幕块已经结束。重复直到你得到你需要的一切。

伪代码:

$screensData = array();
$start = false;
foreach($cinema->find("td.cintime *") as $times) {
   if($times->tag == 'div') {
      $start = false;
      if($times->plaintext == 'Screen: 3') {
         $screensData[3] = array();
         $start = 3;
      }
   }

   if($start && $times->tag == 'span') {
      $screensData[$start][] = $times->plaintext;
   }
}

【讨论】:

  • simplehtmldom.sourceforge.net/manual.htm 中没有名为“元素”的函数。
  • 那是kasp3r的关键。感谢您的帮助,但我似乎找不到任何功能让我这样做
  • 您需要更仔细地查看它。通过在您提供的手册中花费 5 秒钟,我在上一个示例中找到了答案。使用 $times->tag 。伪代码也更新了。
猜你喜欢
  • 1970-01-01
  • 2013-06-28
  • 2014-10-04
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 2014-11-19
  • 2013-07-30
相关资源
最近更新 更多