【问题标题】:I'm building a php web scraper and preg_match gives an error我正在构建一个 php 网络爬虫,而 preg_match 给出了一个错误
【发布时间】:2016-08-16 09:22:23
【问题描述】:

我正在构建一个 ebay 网络爬虫,价格的 preg_match 会引发错误。

preg_match('/<title>([^<]+)<\/title>/i', $data, $matches);
$title = $matches[1];

preg_match('/<img id="icImg"[^>]*src=[\'"]([^\'"]+)[\'"][^>]*>/i', $data, $matches);
$img = $matches[1];

preg_match('/<span id\=\"prcIsum\"\>([^<]+)<\/span>/i', $data, $matches);
$price = $matches[1];

标题和 img 正在被刮掉,但我在价格跨度元素上收到了这个 PHP 错误:PHP Notice: Undefined offset: 1

【问题讨论】:

    标签: php regex preg-match undefined


    【解决方案1】:

    这个错误是不言自明的; $matches[1] 不存在。这可能是因为$data 字符串中没有匹配项。

    preg_match() 如果模式匹配给定主题则返回 1,如果匹配则返回 0 不会,如果发生错误,则为 FALSE。

    $isMatch = preg_match('/<title>([^<]+)<\/title>/i', $data, $matches);
    if($isMatch == 1){
        $title = $matches[1];
    }
    
    
    $isMatch = preg_match('/<img id="icImg"[^>]*src=[\'"]([^\'"]+)[\'"][^>]*>/i', $data, $matches);
    if($isMatch == 1){
        $img = $matches[1];
    }
    
    $isMatch = preg_match('/<span id\=\"prcIsum\"\>([^<]+)<\/span>/i', $data, $matches);
    if($isMatch == 1){
        $price = $matches[1];
    }
    

    也许您应该确保正则表达式对您正在使用的$data 有效,并且它确实返回匹配项。

    【讨论】:

    • $data 只是保存 ebay url $data = file_get_contents('http://www.ebay.com/itm/New-Original-Apple-iPhone-5S-Gold-64GB-iOS-7-8MP-Unlocked-Smart-Phone-By-FedEx-/221320754748?&amp;_trksid=p2056016.m2518.l4276');
    【解决方案2】:

    抛出错误的不是 preg_match() 而是当您分配 $matches1 时它会失败,因为函数没有返回匹配项。所以你需要检查你的正则表达式。使用 preg_match 进行 HTML 解析也没有任何意义。您可以使用DOM parser。要使此正则表达式起作用,您需要添加“m”修饰符。但更好的解决方案是:

    $doc = new DOMDocument();
    $doc->loadHTMLFile($data); //where $data is HTML
    
    $xpath = new DOMXpath($doc);
    
    $elements = $xpath->query("*/span[@id='prcIsum']");
    
    if (!is_null($elements)) {
      foreach ($elements as $element) {
        echo $element->nodeName;
        echo $element->nodeValue;
      }
    }
    

    另一种选择是使用getElementById() 方法。

    这是从 php.net 站点更改的示例。

    【讨论】:

    • 我正在尝试从 Ebay 获取价格跨度值,它的 id 为 prcIsum,检查源代码我可以看到它,是否有阻止 php 找到它的东西?
    • @Radu033:很可能是一些 JavaScript 实际输出的内容。
    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 2011-08-15
    • 2012-11-27
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多