使用简单的HTML DOM来刮?

时间:2012-10-28 08:12:54

标签: php dom loops simple-html-dom scrape

简单的HTML DOM基本上是一个你添加到页面的php,它可以让你进行简单的网页抓取。它在大多数情况下是好的,但我无法弄清楚手册,因为我不是一个编码器。是否有任何网站/指南有更容易的帮助? (目前php.net上的那个对我来说有点太复杂了)有没有更好的地方可以提出这样的问题?

网站位于:http://simplehtmldom.sourceforge.net/manual.htm

我可以抓取具有<tr class="group">等特定类的内容,但不能删除介于两者之间的内容。例如..这就是我目前使用的......

$url = 'http://www.test.com';
$html = file_get_html($url);
foreach($html->find('tr[class=group]') as $result)
  {
    $first = $result->find('td[class=category1]',0);
    $second = $result->find('td[class=category2]',0);
    echo $first.$second;
  }
}

但这是我试图抓的那种代码。

<table>
  <tr class="Group">
    <td>
      <dl class="Summary">
        <dt>Heading 1</dt>
          <dd><a href="#123" class="ViewProfile">Cat</a></dd>
          <dd><a href="#032" class="ViewProfile">Bacon</a></dd>
        <dt>Heading 2</dt>
          <dd><a href="#143" class="ViewProfile">Narwhal</a></dd>
          <dd><a href="#642" class="ViewProfile">Ice Soap</a></dd>
      </dl>
    </td>
  </tr>
</table>

我正在尝试提取每个<dt>的内容并将其放入变量中。然后我试图提取每个<dd>的内容并将其放入一个变量,但我尝试的任何东西都没有。这是我能找到的最好的,但是它只给了我第一个反复的标题而不是第二个标题。

foreach($html->find('tr[class=Summary]') as $result2)
  {
    echo $result2->find('dt',0)->innertext;
  }

感谢任何可以提供帮助的人。对不起,如果不清楚或它太长了。理想情况下,我希望能够更好地理解这些DOM命令,因为我想自己解决这个问题,而不是这里有人这样做(但我也很感激)。

TL; DR:我试图了解如何使用手册中列出的命令(上面的网址)。 “手册”不够简单。你是如何学习这些东西的?

1 个答案:

答案 0 :(得分:3)

我认为$result2->find('dt',0)会返回元素0,这是第一个。如果省略,则应该能够获得数组(或nodelist)。像这样:

foreach($html->find('tr[class=Summary]') as $result2)
{
    foreach ($result2->find('dt') as $node)
    {
       echo $node->innertext;
    }
}

您不需要外部for循环,因为文档中只有1 tr。你甚至可以完全放弃它来查找文档中的每个dt,但是对于这样的工具,我认为灵活和严格是一件好事,所以你准备好多行,但不要小心从文档中的任何位置解析dt