【问题标题】:Regex to filter certain type of url正则表达式过滤某些类型的 url
【发布时间】:2013-03-26 11:30:01
【问题描述】:

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

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

<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%22ProductRatings"

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>

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

谢谢!

这里是完整的脚本:

    <?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 中给出

【问题讨论】:

    标签: php regex url web-crawler


    【解决方案1】:

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

    <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
    

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

    /ObjectPath(.*?)"/
    

    因为它会在第一个 ". 在这种情况下,它相当于:

    /ObjectPath([^"]*)"/
    

    虽然不是一般情况。

    【讨论】:

    • 非常感谢!!!工作正常!奇怪的输出来自一个真正不值得一提的shopcms :)
    【解决方案2】:

    使用

    $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
            )
    
    )
    

    【讨论】:

    • 非常感谢!但不幸的是,这并不能解决问题。我添加了整个脚本。它以 url 开头,应该输出网站上的所有内部链接。通过您的更正,输出仍然相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多