我正在构建一个 php 网络抓取工具,但 preg_match 给出了一个错误
I'm building a php web scraper and preg_match gives an error
我正在构建一个 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 注意:未定义的偏移量:1
不是 preg_match() 抛出错误,而是当您分配 $matches1 it fails because there are no matches returned by function. So you need to check your REGEX. Also there's no sense in using preg_match for HTML parsing. You can use 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 站点更改的示例。
该错误不言自明; $matches[1]
不存在。这可能是因为 $data
字符串中没有匹配项。
preg_match() returns 1 if the pattern matches given subject, 0 if it
does not, or FALSE if an error occurred.
$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
有效并且它确实 return 匹配。
我正在构建一个 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 注意:未定义的偏移量:1
不是 preg_match() 抛出错误,而是当您分配 $matches1 it fails because there are no matches returned by function. So you need to check your REGEX. Also there's no sense in using preg_match for HTML parsing. You can use 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 站点更改的示例。
该错误不言自明; $matches[1]
不存在。这可能是因为 $data
字符串中没有匹配项。
preg_match() returns 1 if the pattern matches given subject, 0 if it does not, or FALSE if an error occurred.
$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
有效并且它确实 return 匹配。