使用php和cURL从外部网站提取元素/数据

时间:2013-01-30 13:05:33

标签: php curl

我正在尝试使用 PHP cURL 从外部网站提取元素。

  • 我试图从中提取内容的网站链接是: http://www.stayclassy.org/fundraise?fcid=231864

  • 我定位的元素是列表项目下的数字值 位于顶部右栏的“升得太远”(现在价值为10美元)。

  • 以下是我用来提取数据的代码:

        define("TARGET", "http://www.stayclassy.org/fundraise?fcid=231864");

    $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, TARGET); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); if(!($results = curl_exec($curl))) { print("{ \"total\": \"$0.00\" }"); return; } $pattern = '/\<li class="goalTitle"\> \$(.+?) \<\/li\>\<\/a\>/'; preg_match_all($pattern, $results, $matches); $total = $matches[1][0]; $total = str_replace(",", "", $total); printf("{ \"total\": \"$%s\" }", formatMoney($total, true)); function formatMoney($number, $fractional=false) { if ($fractional) { $number = sprintf('%.2f', $number); } while (true) { $replaced = preg_replace('/(-?\d+)(\d\d\d)/', '$1,$2', $number); if ($replaced != $number) { $number = $replaced; } else { break; } } return $number; }

我遇到的问题是我所定位的列表项/元素没有唯一的ID或类。实际上,美元金额位于单独的列表项中,没有类。

我想知道如何使用上面的代码在无序列表中定位特定列表项,特别是当它没有类时。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

定位特定项目需要您识别其周围的唯一字符串。要做到这一点,你只需要进一步扩展,直到找到一个只能出现一次的字符串。所以,你想要的是:

<li>$10</li>

但这根本不是唯一的。所以我们通过添加前一行来扩展字符串:

<li class="goalTitle">Raised so far:</li>
<li>$10</li>

和宾果游戏,这个字符串是您的需求所独有的。除了你的数量之外,字符串是相当常量的,所以它很容易使用。所以你需要一个找到这个字符串的正则表达式。我会用这样的东西:

$pattern = '/<li class="goalTitle">Raised so far:<\/li>\s*<li>\$(\d+)<\/li>/';

您不需要使用preg_match_all,因为您只希望获得一场比赛:

preg_match($pattern, $results, $matches);
$total = $matches[1];

您的其他选项包括使用DOMDocument加载页面,然后使用XPathgetElementById来解析DOM。但是,这项工作可能需要付出太多努力。

另外,我使用file_get_contents来获取远程站点的内容。但那只是我。


更新:要处理数千个分隔符,请按以下步骤修改模式:

$pattern = '/<li class="goalTitle">Raised so far:<\/li>\s*<li>\$([\d\.,]+)<\/li>/';