【问题标题】:Problem with SimpleHTMLDomSimpleHTMLDom 的问题
【发布时间】:2010-07-19 00:48:36
【问题描述】:

我遇到了一个使用 SimpleHTMLDOM 提取页面 URL 列表的 PHP 脚本的问题。

如果我指定要读取链接的 URL,脚本不会给我任何问题:

          $url='http://www.example.com';

          $blogpost = file_get_html($url);
          foreach ($blogpost->find('a[href*=example1]') as $example1link) {
              $example1link = $example1link->href;
              echo $example1link;
          }

所有这一切都是从 www.example.com 拉出所有指向 www.example1.com 的链接并将其回显给我。

但是当我尝试向脚本提供带有 URL 的文本文件时:

  $urlarray = split("\n", file_get_contents('urls.txt'));

     foreach ($urlarray as $url) {

          $blogpost = file_get_html($url);
          foreach ($blogpost->find('a[href*=example1]') as $example1link) {
              $example1link = $example1link->href;
              echo $example1link;
          }
  }

它给了我以下错误:

Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty  
in simple_html_dom.php  on line 39

对于那些没有 simple_html_dom.php 的人,这是错误所指的函数:

function file_get_html() {
  $dom = new simple_html_dom;
  $args = func_get_args();
  $dom->load(call_user_func_array('file_get_contents', $args), true);
  return $dom;
 }

我什至可以在将值分配给 $blogpost 之前回显 $url。问题似乎在于将 $url 变量传递给 file_get_html()。但只有当我使用带有目标链接的txt文件来抓取时。

我对 PHP(和一般编程)非常陌生,我几乎整天都在搜索,但找不到我做错了什么。

感谢任何帮助。

谢谢!

【问题讨论】:

  • simple_html_dom.php 的第 39 行是什么?
  • 第 39 行是这样的: $dom->load(call_user_func_array('file_get_contents', $args), true);在上面的 file_get_html() 函数中。
  • 好的,正如 Aircule 所讨论的,在调用 file_get_html() 时,您在某个时刻通过 $url 传入了一个空字符串。 (删除了我对 func_get_args() 的评论,因为我意识到这不是您的代码,而是您正在使用的库。)
  • 是的,问题与此有关。我认为这是某种 Windows/UNIX 换行符问题。关于函数调用,simple_html_dom 是一个 DOM 解析器,不是我写的。感谢您修改和改进它的想法。
  • 作为一个库函数,它的方式很好。它旨在允许您传递未指定数量的参数。由于您是 PHP 和编程的新手,我假设您从某个地方复制了该构造。一般来说,您不想修改库代码,除非绝对必要。这样,如果您需要/想要升级库,您就不必将更改传播到库的新版本。

标签: php


【解决方案1】:

嗯,这就是它所说的:您试图将空字符串传递给 file_get_contents 函数,该函数可能由 file_get_html 调用。这很可能是因为当您使用 split() 时(顺便说一下,已弃用 - 请改用 explode),您将生成一个在某些条目中包含空字符串的数组。

您可以使用错误抑制(即:$blogpost = @file_get_html(...))简单地吞下错误,或者确保您没有将空字符串传递给您的方法,即:

if (!empty($url))
   $blogpost = file_get_html($url);

【讨论】:

  • 我以为是这个问题,但是为什么它可以在上面代码中的 $blogpost 变量赋值之前回显 $url 变量呢?我添加了一个“echo $url;”只是为了测试它,变量每次都在那里。就像传递给 simple_html_dom.php 时 $url 值丢失了
  • 感谢 Aircule,您的帖子给了我一个想法。我用“|”尝试了爆炸(管道字符)而不是 \n (换行符)并且它有效。可能是 Windows 换行符问题?
  • @RafaelM 您可能根本没有注意到空字符串,它们也是空字符串。尝试使用一些 <pre>...</pre> 标记来包装 echo 的输出并检查源。或者,更好的是,使用var_dump($url) 它会给你更多关于变量的信息,比如它的类型、字符串的长度等等。
  • @RafaelM 它似乎每次都有效,因为当您回显一个空变量时,您看不到它;)问题是它生成的条目比实际的多是,并不是说某些条目消失了。
  • @RafaelM 正如@George 所建议的,这里有两个非常有用的函数:print_rvar_dump。确保使用<pre> 标签。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多