【问题标题】:Using Simple HTML DOM to Scrape?使用简单的 HTML DOM 来抓取?
【发布时间】:2012-10-28 08:12:54
【问题描述】:

简单的 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>

我正在尝试提取每个&lt;dt&gt; 的内容并将其放入一个变量中。然后我试图提取每个&lt;dd&gt; 的内容并将其放入一个变量中,但我没有尝试过任何工作。这是我能找到的最好的,但它只会重复返回第一个标题,而不是返回第二个标题。

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

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

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

【问题讨论】:

  • 我非常讨厌 Simple DOM。你得到的对象和数组的地狱般的混合是......地狱般的。 PHPQuery 有点酷,但最终我转向 Python 和 Beautiful Soup 来完成这类任务。
  • 是的,理想情况下我宁愿使用 Python,但是我必须学习一些最终对我来说更有用的东西。我已经查看了 PHPQuery 并且无法确定它的正面或反面。我只是希望有一种简单的方法来学习这些东西……或者即使有一本书或其他东西我可以完成。
  • 只是我的建议,因为我在学习时遇到了同样的问题,并得出结论认为“简单 DOM”绝非如此。我认为这真的很糟糕,并且全心全意地建议寻找任何其他可能的替代方案。

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


【解决方案1】:

我认为$result2-&gt;find('dt',0) 会给你返回元素0,这是第一个。如果你忽略它,你应该能够得到一个数组 (or nodelist) 。像这样的:

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

您并不严格需要外部 for 循环,因为您的文档中只有 1 个 tr。你甚至可以完全放弃在文档中找到每个dt,但是对于像这样的工具,我认为既灵活又严格是一件好事,所以你准备好处理多行,但不要意外解析@ 987654325@s 来自文档中的任何位置。

【讨论】:

  • 哇,谢谢!它停止了重复。很抱歉这个复杂的问题,感谢您的帮助。文档中实际上有大量的“tr”标签,但为了简单起见,我删掉了大部分。外部标签只是将其缩减为我在此示例中显示的内容。
猜你喜欢
  • 1970-01-01
  • 2014-10-04
  • 2013-07-30
  • 1970-01-01
  • 2021-05-18
  • 2013-12-26
  • 2015-01-07
  • 2016-02-22
  • 1970-01-01
相关资源
最近更新 更多