0

私は、Webサイト内のすべてのリンクを読み取るための簡単なクローラースクリプトを作成して学習しています。パターンに問題があり、なぜこれが機能しないのかわかりません。

ウェブサイトのソースコードでは、リンクは次のようになっています。

<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が文字列であることを想定しています。配列はC:\ xampp \ htdocs \ scripts\readratings.phpの48行目にあります。

4

2 に答える 2

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 に答える
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 に答える