2

私は検索を行い、stackoverflow で多くの例を見てきましたが、それでも動作しません。

Web サイトをクロールして、自分のスポーツ クラブの順位表を取得したいと考えています。

私の問題は、テーブルから「tr」コンテンツを取得できないことです。最初はREGEXを使用していましたが、人々がそれを推奨しないことを読んだので、今はXPathを使用していますが、動作しません。

クロールしたいページは次のとおりです。http://resultater.dai-sport.dk/tms/Turneringer-og-resultater/Pulje-Stilling.aspx?PuljeId=104

そして、私が今持っているコードは次のとおりです。

$doc = new DOMDocument();
$doc->loadHTMLFile("http://resultater.dai-sport.dk/tms/Turneringer-og-resultater/Pulje-Stilling.aspx?PuljeId=104"); // or you could load from a string using loadHTML();
$xpath = new DOMXpath($doc);
$elements = $xpath->query("/table/thead/tbody/tr");

print_r($elements);

私が得ている結果は次のとおりです: DOMNodeList Object ( [length] => 0 )

私は完全に間違っていますか?

4

1 に答える 1

1

@PeeHaa が気付くように、tbodyタグはタグ内にありませんthead(通常のコードでは)。ただし、tbodyソースコードにはタグがないため、次を使用できます。

$elements = $xpath->query("//table/tr");

サイトからデータを抽出するには、これを使用できます。

$elements = $xpath->query("//table/tr[contains(@class,'sr')]");

$keys = array('nb', 'hold', 'k', 'v', 'u', 't', 'scoreA', 'scoreB', 'p');

foreach ($elements as $elt) {
    $results[] = array_combine($keys,
     preg_split('~^\s++|\s++$|\h*+\R\s*+-?\s*+~', $elt->textContent, null, 1)
    );
}
echo '<pre>' . print_r($results, true);

もう 1 つの方法はpreg_match()、 の構造を使用して記述することですtextContent。2 番目のリンクの例:

$pattern = <<<'LOD'
~
(?<kampnr>     [0-9]++                    ) \s++
(?<dato>       [0-9]{2}-[0-9]{2}-[0-9]{2} ) \s++
(?>
    kl\. \s++
    (?<kl> [0-9]{2}:[0-9]{2} ) \s++
)?
(?<hjemmehold> .+?                        ) \h*+ \R \s++
(?<udehold>    .+?                        ) \h*+ \R \s++
(?<spillA>     .+?                        ) \h*+ \R \s++
(?<spillB>     .+?                        ) \h*+ \R \s++
(?>
    (?<resultatA> [0-9]++    ) \s*+ - \s*+
    (?<resultatB> [0-9]++    ) 
)? 
~xu
LOD;

foreach ($elements as $elt) {
    if (preg_match($pattern, $elt->textContent, $match)) {
        foreach($match as $k=>$v) {
            if (is_numeric($k)) unset($match[$k]);
        }
        $result[] = $match;
    }                
}
echo '<pre>' . print_r($result, true);
于 2013-11-09T19:20:07.437 に答える