2

PHPcURLを使用して外部Webサイトから要素を取得しようとしています。

  • コンテンツを取得しようとしているWebサイトへのリンクは次のとおりです。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またはクラスがないことです。実際、金額はクラスのない別のリスト項目にあります。

特にクラスがない場合に、上記のコードを使用して、順序付けされていないリスト内の特定のリストアイテムをターゲットにする方法を考えていました。何か案は?

4

1 に答える 1

2

特定のアイテムをターゲットにするには、その周りの一意の文字列を識別する必要があります。これを行うには、1回だけ発生することを識別できる文字列が見つかるまで、さらに拡張します。したがって、必要な行は次のとおりです。

<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一致するものが1つしかないため、使用する必要はありません。

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

他のオプションには、ページをロードしてから、またはをDOMDocument使用してDOMを解析することが含まれます。しかし、それはこのタスクには少し手間がかかるかもしれません。XPathgetElementById

また、file_get_contentsリモートサイトのコンテンツを取得するために使用します。しかし、それは私だけです。


更新:数千のセパレーターも処理するには、パターンを次のように変更します。

$pattern = '/<li class="goalTitle">Raised so far:<\/li>\s*<li>\$([\d\.,]+)<\/li>/';
于 2013-01-30T13:49:12.370 に答える