在第一次加载时获取“通知:未定义偏移量”的已删除内容 - 刷新后修复

时间:2013-06-26 22:09:21

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

新手程序员在这里开始学习php并尝试制作我自己的网络刮刀。我做了一些广泛的搜索,似乎无法找到解决方案。

我创建了一个表单,允许用户提交查询,然后从pinterest中抓取图像并显示热门点击。但是,在提交查询后第一次加载页面时,我得到:“注意:未定义的偏移量:在第27行的C:\ xampp \ htdocs \ domwebcrawler.php中为0”(28& 29)。在X次刷新后,页面最终会加载图片。

这些行对应于我的代码行

HTML / PHP

<html>
<head>
<link type="text/css" href="domwebcrawler.css" rel="stylesheet" media="all" />  

</head>
<body>

<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="get">
<input type="text" name="searchquery"> <input type="submit"> <br>
What do you want to search today?

<?php
include 'simple_html_dom.php';
$dom = new simple_html_dom();
@$query = $_GET["searchquery"];
if (!empty($query)) {
    $dom->load_file('http://pinterest.com/search/pins/?q=' .    urlencode($query));
    $images= $dom->find('.PinHolder img');
    $descriptions = $dom->find('.description');
    $repins = $dom->find('.RepinsCount');

?>
<div class="js-masonry" data-masonry-options='{"itemSelector": ".pins",    "columnWidth":10}'>
<?php 
    for ($i=0; $i< 20 ; $i++) {
        echo '<div class="pins">'; 
        if($images[$i])
        echo '<div class="pinimg">' . $images[$i] . '</div>';
        if($descriptions[$i])
        echo '<div class="description">'. $descriptions[$i] . '</div>';
        if($repins[$i])
        echo '<div class="repin_count">' . $repins[$i] . '</div>';
        echo '</div>';
    };
};

?>
</div>

</body>
<script src="masonry.js"></script>
<script src="jquery.js" type="text/javascript"></script>
<script src="jquery.lazyload.js" type="text/javascript"></script>
</html>

CSS

.pins {
padding: 1%;
margin:1%;
border:solid 3px black;
width: 200px;
}

.pinimg img{
width:100%;
}
.description, .repin_count {
text-align: center;
}

我认为它可能有一些东西,因为在加载所有抓取内容之前页面加载了?但我不确定!

欢迎所有帮助(以及对低效代码的批评)!

热烈的问候

2 个答案:

答案 0 :(得分:0)

你的代码假设$ images,$描述和$ repins的[0]点总是有东西。

使用isset来避免该消息

if($images[$i])
echo '<div class="pinimg">' . $images[$i] . '</div>';
if($descriptions[$i])
echo '<div class="description">'. $descriptions[$i] . '</div>';
if($repins[$i])
echo '<div class="repin_count">' . $repins[$i] . '</div>';

答案 1 :(得分:0)

@Amal是对的。只需确保添加isset。您检索的每个对象都是数组。您正在访问不存在的数组的索引。

<?php
include 'simple_html_dom.php';
$dom = new simple_html_dom();
$query = "html";
function print_type($var){
  echo gettype($var);
  echo "</br>";
  if (is_array($var)){
    echo sizeof($var);
  }
  echo "</br>";
}
if (!empty($query)) {
  $dom->load_file('http://pinterest.com/search/pins/?q=' .    urlencode($query));
  $images= $dom->find('.PinHolder img');
  print_type($images);
  $descriptions = $dom->find('.description');
  print_type($descriptions);
  $repins = $dom->find('.RepinsCount');
  print_type($repins);

?>
<html>
<head>
<!-- put some info here-->
<title>Pinterest parser</title>
</head>

<body>

<?php
  for ($i=0; $i< 20 ; $i++) {
?>
  <div class="pins">
<?php
    if(isset($images[$i])){
?>
    <div class="pinimg">
<?php
      echo $images[$i]
?>
    </div> <!-- end pinimg -->
<?php
    }
?>
<?php
    if(isset($descriptions[$i])){
?>
  <div class="description">
<?php
      echo $descriptions[$i]
?>
  </div><!-- end description -->
<?php
    }
?>
<?php
    if(isset($repins[$i])){
?>
    <div class="repin_count">
<?php
      echo $repins[$i]
?>
        </div> <!-- end repin_count -->
<?php
   }
?>
  </div><!-- end pins-->
 <?php
  }
}
?>
</body>
</html>