【问题标题】:Simple PHP DOM Parser doesn't work in switch case (PHP)简单的 PHP DOM 解析器在 switch case (PHP) 中不起作用
【发布时间】:2011-12-29 14:38:13
【问题描述】:

我遇到了 Simple PHP DOM Parser 的问题。我基本上必须为图像及其标题抓取目录站点。

该网站是http://pinesite.com.

我想出了下面的代码来做这件事(这将通过 AJAX 调用):

<?php
include ('simple_html_dom.php');
$function = $_GET['function'];
switch($function) {
  case 'subcat':
    $maincat = $_GET['cat'];
    $url = "http://www.pinesite.com/meubelen/index.php?".$maincat."&lang=de";
    $html = file_get_html($url);
    $data = $html->find('.box_166_content .act_path li a');
    $output ="";
    foreach ($data as $subcat) {
      $title = $subcat->plaintext;
      $href = $subcat->href;
      $link['title'] = $title;
      $link['href'] =substr($href,10);
      $output[] = $link;
    }
    echo json_encode($output);
    $html->clear();
    unset($html);
    unset($url);
    break;

  case 'images':
    $subcat = $_GET['subcat'];
    $url = "http://www.pinesite.com/meubelen/index.php?".$subcat;
    $html = file_get_html($url);
    $iframe = $html->find('#the_iframe',0);
    $url2 = $iframe->src;
    $html->clear(); 
    unset($html);

    $html2 = file_get_html("http://www.pinesite.com/meubelen/".$url2);
    $titles = $html2->find('p');
    $images = $html2->find('img');
    $output='';
    $i=0;
    foreach ($images as $image) {
      $item['title'] = $titles[$i]->plaintext;
      $item['thumb'] = $image->src;
      $item['image'] = str_replace('thumb_','',$image->src);
      $output[] = $item;
      $i++;
    }
    echo json_encode($output);
    break;
}
?>

这就是“函数”文件,不起作用的部分是最后一种情况。

我不知道这里出了什么问题,所以我在一个单独的文件中测试了它(最后一种情况)(我把它从 iFrame 获得的 URL 放入了(该部分确实有效):

<?php
include_once "simple_html_dom.php";

$fullurl = "http://www.pinesite.com/meubelen/prog/browse.php?taal=nl&groep=18&subgroep=26";

$html = file_get_html($fullurl);
$titles = $html->find('p');
$images = $html->find('img');
$output='';
$i=0;
foreach ($images as $image) {
  $item['title'] = $titles[$i]->plaintext;
  $item['thumb'] = $image->src;
  $item['image'] = str_replace('thumb_','',$image->src);
  $output[] =$item;
  $i++;
}
echo json_encode($output);
?>

就像我说的那样,第一部分应该返回与第二部分相同的结果(如果添加 ?function=images&subcat=dichte-kast),但事实并非如此。我猜是因为我多次使用解析器。

有人给我建议吗?

【问题讨论】:

  • 您实际上没有检查过 url 检索是否有效。 $url2 实际上有一个有效的网址吗? $html2 有一些页面内容吗?您的脚本完全取决于服务器的网络连接是否稳定以及远程站点是否可用,没有任何错误的余地。
  • 我知道 :),这只是对抓取的测试,我会在它上线之前解决所有问题。

标签: php parsing screen-scraping simple-html-dom


【解决方案1】:

我不确定我是否完全理解了这个问题,但据我所知,您正试图从给定网页中获取一些图像及其相关标题,然后保存它们?如果是这样的话,那么这里有一些值得深思的地方。 (对不起,不能更具体)。

使用 file_get_contents 获取 html 内容。

$html = file_get_contents('www.someurl.com');

然后 preg_match() 你可能需要的所有图像标签和其他数据。有很多关于如何做到这一点的信息Matching SRC attribute of IMG tag using preg_match

 $matches = preg_match('<img>*<\/img>', $html); # this is a guess

一旦您将图像标签集合作为数组,然后使用 curl 保存图像

http://www.edmondscommerce.co.uk/php/php-save-images-using-curl/

我认为您遇到的问题是从您想要的内容中剥离 html 内容

【讨论】:

  • 他已经在使用 DOM 解析器来执行此操作。此外,他的问题不在于他的解析方法。
  • 啊,我误解了这个问题
  • 只需查看pinesite,单击一个类别,然后单击左侧的子类别。我要做的就是以 JSON 格式获取产品图像的 src 及其标题,以便我可以使用它们。
【解决方案2】:

问题在于您的 $url2 变量包含 html 实体,当您将其连接到根 url 时,结果不是有效的 url。因此,file_get_html() 函数不会检索您期望的 url(以及数据),而是一些不同的东西。

您的问题的快速解决方案是html_entity_decode(),但您可能还想阅读有关调试的信息。它可以像将var_dump(); 应用于您正在使用的每个变量一样简单,并查看输出与您期望的输出不同的地方。

您可能还想检查一些安全问题。写$subcat = $_GET['sub_cat'] 绝不比直接使用$_GET['sub_cat'] 更安全。

【讨论】:

  • 谢谢,我知道这有点像,是的,我知道整个安全问题。一旦我真正有一个基本的工作版本,我会修复这些。
  • 如果我的回答对您有帮助,请您批准 :)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 2016-07-30
相关资源
最近更新 更多