我正在尝试使用 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或类。实际上,美元金额位于单独的列表项中,没有类。
我想知道如何使用上面的代码在无序列表中定位特定列表项,特别是当它没有类时。有什么想法吗?
答案 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
加载页面,然后使用XPath
或getElementById
来解析DOM。但是,这项工作可能需要付出太多努力。
另外,我使用file_get_contents
来获取远程站点的内容。但那只是我。
更新:要处理数千个分隔符,请按以下步骤修改模式:
$pattern = '/<li class="goalTitle">Raised so far:<\/li>\s*<li>\$([\d\.,]+)<\/li>/';