0

我正在编写和学习一个简单的爬虫脚本来读取网站中的所有链接。我的模式有问题,我不明白为什么这不起作用。

链接在网站的源代码中如下所示:

<a  href="?ObjectPath=/Shops/154567062/Categories/Handlauf/%22Handlauf%20Holz%22">Handlauf Holz  </a>

我的模式和功能如下所示:

preg_match_all( '/ObjectPath.*"/', $contentrow, $output, PREG_SET_ORDER

它适用于前半部分,但之后它会破坏输出。这是一个输出的示例,其中它被破坏了:

ObjectPath=/Shops/15456062/Categories">- GESAMTANGEBOT -Handläufe

ObjectPath=/Shops/15456062/Products/%22Handlauf%20Edelstahl%20DS01%22/SubProducts/%22Handlauf%20Edelstahl%20DS%2001%20014%22&#ProductRatings"

ObjectPath=/Shops/15456062/Categories/CustomerInformation"

ObjectPath=/Shops/15456062/Products/%22Handlauf%20Edelstahl%20DS01%22/SubProducts/%22Handlauf%20Edelstahl%20DS%2001%20014%22&ChangeAction=SelectSubProduct" method="post"

源代码中的部分,即该部分的来源,如下所示:

<a class="BreadcrumbItem" href="?ObjectPath=/Shops/345456456/Categories">-GESAMTANGEBOT-</a><a class="BreadcrumbItem" href="?ObjectPath=/Shops/1234346q/Categories/Handlauf">Handläufe</a><a class="BreadcrumbItem" href="?ObjectPath=/Shops/15456062/Categories/Handlauf/%22Handlauf%20Edelstahl%22">Handläufe Edelstahl</a>

我不明白,为什么将部分 -GESAMTANGEBOT- 纳入模式。“应该完成吗?

谢谢!

这里是完整的脚本:

    <?php
header('Content-Type: text/html; charset=utf-8');
function getPage($url){      

  // Prüfung ob cURL installiert ist?   
  if (!function_exists('curl_init')){             
    die('Curl not initialed');       
  }

  // Array mit den cURL-Einstellungen
  $options = array(        
      CURLOPT_RETURNTRANSFER => true,      
      CURLOPT_HEADER         => false,
      CURLOPT_ENCODING       => "",        

      CURLOPT_CONNECTTIMEOUT => 120,
      CURLOPT_TIMEOUT        => 120,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_AUTOREFERER    => true,
      CURLOPT_MAXREDIRS      => 10 
  );

  $ch      = curl_init( $url );    
  curl_setopt_array( $ch, $options );     

  $content = curl_exec( $ch );    
  $err     = curl_errno( $ch );    
  $errmsg  = curl_error( $ch );    
  $header  = curl_getinfo( $ch );    

  curl_close( $ch );     

  $header['errno']   = $err;    
  $header['errmsg']  = $errmsg;    
  $header['content'] = $content;    

  return $header;
}


$url = "http:/domain.com/epages/23455467.sf/de_DE/?ObjectPath=/Shops/15456062/Products/%22Handlauf%20Edelstahl%20DS01%22/SubProducts/%22Handlauf%20Edelstahl%20DS%2001%20014%22";
$domain = 'http://www.domain.com/epages/452563456.sf/de_DE/?';

$content = getPage($url);
$i=0;
foreach ($content as $contentrow) {
    //go through content and look for links
    if (preg_match_all( '/ObjectPath(.*)"/', $contentrow, $output, PREG_SET_ORDER )) {
        $i++;
        echo '<h1>'.$i.'</h1>';
        foreach ($output as $row) {
            $url= $domain.$row[0];
            //echo '<a href="'.$url.'">'.$url.'</a>';
            echo $url;
            echo '<br /><h2>onerow</h2><br />';
        }
    }
}

//print_r($content);

我忘了提一下,我在输出上方收到了这个警告:

警告:preg_match_all() 期望参数 2 是字符串,数组在第 48 行的 C:\xampp\htdocs\scripts\readratings.php 中给出

4

2 回答 2

0

如果我理解正确,你有类似的东西:

<a class="BreadcrumbItem" href="?ObjectPath=/Shops/345456456/Categories">-GESAMTANGEBOT-</a><a class="BreadcrumbItem" href="?ObjectPath=/Shops/1234346q/Categories/Handlauf">Handläufe</a><a class="BreadcrumbItem" href="?ObjectPath=/Shops/15456062/Categories/Handlauf/%22Handlauf%20Edelstahl%22">Handläufe Edelstahl</a>

你想要所有这些部分:

ObjectPath=/Shops/345456456/Categories
ObjectPath=/Shops/1234346q/Categories/Handlauf
ObjectPath=/Shops/15456062/Categories/Handlauf/%22Handlauf%20Edelstahl%22

虽然我不知道你为什么会有这个奇怪的输出,但你应该能够使用惰性运算符获得你想要的东西。这应该做你想要的:

/ObjectPath(.*?)"/

因为它将停在第一个“。在这种情况下,它相当于:

/ObjectPath([^"]*)"/

虽然不是一般情况。

于 2013-03-26T16:51:36.697 回答
0

利用

$contentrow = '<a  href="?ObjectPath=/Shops/154567062/Categories/Handlauf/%22Handlauf%20Holz%22">Handlauf Holz  </a>';
preg_match_all( '/ObjectPath(.*)"/', $contentrow, $output, PREG_SET_ORDER);
print_r($output);

输出:

Array
(
    [0] => Array
        (
            [0] => ObjectPath=/Shops/154567062/Categories/Handlauf/%22Handlauf%20Holz%22"
            [1] => =/Shops/154567062/Categories/Handlauf/%22Handlauf%20Holz%22
        )

)
于 2013-03-26T11:38:25.027 回答