8

我正在尝试为一些朋友创建一个简单的警报应用程序。

基本上我希望能够从如下两个网页中提取数据“价格”和“库存可用性”:

我已经通过电子邮件和短信部分发出警报,但现在我希望能够从网页(那两个或任何其他网页)中获取数量和价格,以便我可以比较可用的价格和数量并提醒我们如果产品介于某些阈值之间,则下订单。

我已经尝试了一些正则表达式(在一些教程中找到,但我对此太过分了)但还没有设法让它工作,有什么好的提示或例子吗?

4

6 回答 6

32
$content = file_get_contents('http://www.sparkfun.com/commerce/product_info.php?products_id=9279');

preg_match('#<tr><th>(.*)</th> <td><b>price</b></td></tr>#', $content, $match);
$price = $match[1];

preg_match('#<input type="hidden" name="quantity_on_hand" value="(.*?)">#', $content, $match);
$in_stock = $match[1];

echo "Price: $price - Availability: $in_stock\n";
于 2010-01-07T11:58:59.420 回答
8

这称为屏幕抓取,以防您需要谷歌搜索。

我建议您改用 dom 解析器和 xpath 表达式。首先通过 HtmlTidy 提供 HTML,以确保它是有效的标记。

例如:

$html = file_get_contents("http://www.example.com");
$html = tidy_repair_string($html);
$doc = new DomDocument();
$doc->loadHtml($html);
$xpath = new DomXPath($doc);
// Now query the document:
foreach ($xpath->query('//table[@class="pricing"]/th') as $node) {
  echo $node, "\n";
}
于 2010-01-07T12:01:31.210 回答
5

你做什么:不要使用正则表达式来解析 HTML,否则会发生不好的事情。请改用解析器

于 2010-01-07T11:33:10.703 回答
2

您可能最好将 HTML 代码加载到像这样的 DOM 解析器中并搜索“定价”表。但是,只要他们更改页面布局,您所做的任何类型的抓取都可能会中断,并且未经他们的同意可能是非法的。

不过,最好的方法是与网站的运营者交谈,看看他们是否有替代的、更可靠的数据交付形式(想到 Web 服务、RSS 或数据库导出)。

于 2010-01-07T11:37:57.547 回答
2

第一,问这个问题太详细了。第二,从网站中提取数据可能是不合法的。但是,我有提示:

  1. 使用 Firebug 或 Chrome/Safari Inspector 探索 HTML 内容和有趣信息的模式

  2. 测试您的 RegEx 以查看是否匹配。您可能需要多次执行(多遍解析/提取)

  3. 通过 cURL 或更简单的方式编写客户端,使用 file_get_contents(注意,某些主机禁用使用 file_get_contents 加载 URL)

对我来说,我最好使用 Tidy 转换为有效的 XHTML,然后使用 XPath 来提取数据,而不是 RegEx。为什么?因为 XHTML 不规则,而 XPath 非常灵活。您可以学习 XSLT 进行转换。

祝你好运!

于 2010-01-07T11:43:24.247 回答
0

从网站提取数据的最简单方法。我分析了我的所有数据<h3>都只包含在标签中,所以我准备了这个。

<?php
    include(‘simple_html_dom.php’);
        // Create DOM from URL, paste your destined web url in $page 
        $page = ‘http://facebook4free.com/category/facebookstatus/amazing-facebook-status/’;
        $html = new simple_html_dom();
        
       //Within $html your webpage will be loaded for further operation
        $html->load_file($page);
        
        // Find all links
        $links = array();
        //Within find() function, I have written h3 so it will simply fetch the content from <h3> tag only. Change as per your requirement.
       foreach($html->find(‘h3′) as $element) 
        {
            $links[] = $element;
        }
        reset($links);
        //$out will be having each of HTML element content you searching for, within that web page
        foreach ($links as $out) 
        {
            echo $out;
        }                
    
?>
于 2012-11-05T16:31:16.543 回答