2

我正在尝试使用PHPcURL从外部网站中提取一个元素。

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

  • 我要定位的元素是
    顶部右列中列表项“Raised So Far”下的数字值(现在值是 10 美元)。

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

        定义(“目标”,“ 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 或类。事实上,美元金额位于没有类别的单独列表项中。

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

4

1 回答 1

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>/';
于 2013-01-30T13:49:12.370 回答