使用简单的 HTML DOM 来抓取?

问题描述 投票:0回答:1

简单的 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: 我试图了解如何使用手册中列出的命令(上面的网址)。 “手册”不够简单。你如何去学习这些东西?

php loops web-scraping dom simple-html-dom
1个回答
3
投票

我认为

$result2->find('dt',0)
给你返回元素
0
,这是第一个。如果省略它,您应该能够获得一个数组(或节点列表)。像这样的东西:

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

您并不严格需要外部 for 循环,因为您的文档中只有 1 个 tr 。你甚至可以完全放弃它来查找文档中的每个

dt
,但是对于像这样的工具,我认为既灵活又严格是一件好事,这样你就为多行做好了准备,但不要意外解析
 dt
来自文档中的任何位置。

© www.soinside.com 2019 - 2024. All rights reserved.