1

私はテレビのエピソード追跡ウェブサイトから「次のエピソード番号」を単純に抽出しようとしてきました。ページの例を次に示します。

サンプルページ

下にスクロールすると、「カウントダウン」、「日付」、「シーズン」、「番号」が表示されます。その数を抽出したいと思います。

私はソースコードとSimpleHTMLDOMを調べて何かを試してきましたが、何度も失敗しました。「number」のクラスは「nextEpInfo」ですが、「Countdown」、「season」なども同じクラスです。

どうすれば抽出できますか?

また、可能であれば、抽出する必要のあるコンテンツがさまざまなクラス、divにラップされているときに、将来これらの状況に対処する方法を学びたいので、あなたが推奨する方法を説明するいくつかの良いリファレンスを本当に感謝します...等

4

4 に答える 4

1

解析するページの生のHTMLがある場合は、preg_matchを使用してそれを見つけることができます。

HTMLがない場合は、次のようになります。PHPでWebページのHTMLコードを取得するにはどうすればよいですか。

preg_match()

この関数を使用すると、正規表現パターンを使用して文字列を解析できます。すべてのページではなく、HTMLの一部のみを解析することをお勧めします。たとえば、この場合、最初のテーブル(前のエピソードの情報がないテーブル)のHTMLを取得しようとします。

$subject="the HTML of the url you want to parse";
$pattern='/Number:<\/td><td.+?>(\d+)<\//';
if(preg_match($pattern, $subject, $hits)){
    echo "Number: $hits[0]";
}

正規表現がどのように機能するかわからない場合:

'。' は「任意の文字」を意味する予約文字であり、その直後の「+」は「1つ以上の」および「?」を意味します。正規表現を欲張りにしないようにします。したがって、それを合計すると、「。+?」「任意の1つ以上の文字を意味しますが、できるだけ短くしてください」。

'('および')'は、それらの間にあるものを取得することを示し、'\d'は数値を意味します。したがって、「(\ d +)」は「その数値の組み合わせを$hits配列に入れる」ことを意味します。

同じ正規表現を使用するが、preg_match_allを使用すると、同じパターンに従うWebのすべての番号を取得する場合、それらは$hits配列内にあります。

于 2012-11-05T12:54:45.363 に答える
0

これは、Xpathを使用して実行できます。

(//td[contains(text(), 'Number')])[1]/../td[2]

このクエリは、テキストがに等しい最初のtdに移動しますNumber。次に、その子の親ノード( )に移動し、次に次のエピソード番号を含む/../2番目のtdに移動します。(td[2])

Firebugを使用すると、以下を使用してコンソールでXpathクエリをテストできます$x

$x("(//td[contains(text(), 'Number')])[1]/../td[2]");

これをPHPで使用するには、DOMDocumentDOMXpathを確認してください。より具体的DOMDocument.loadHtmlDOMXpath.query

于 2012-11-05T12:54:12.520 に答える
0

以下は、使用できる擬似コードの例です。

1)クラスnextEpInfoを使用してすべてのtrを取得します。

foreach($html->find('tr.nextEpInfo') as $tr)

2)trごとに、stristrを使用してキーワードが含まれているかどうかを確認します。例:if(stristr($tr, 'Countdown') !== FALSE)

3)この場合、trの下の2つのtdsのテキストコンテンツを抽出します。 $tds = $tr->find('td')

4)2番目のtdから目的の値を取得します。 $tds[1]->plaintext

于 2012-11-05T13:01:56.760 に答える
0
<?php
/*

<tr class="nextEpInfo">
<td width="160" align="right" nowrap="" class="nextEpInfo">Season:    </td>
<td class="nextEpInfo" width="300">4</td>
</tr>
*/
$url = 'http://next-episode.net/the-good-wife';
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch,CURLOPT_ENCODING, 1);
curl_setopt( $ch, CURLOPT_REFERER, $url );
$content = curl_exec ($ch);
//echo $content;
$matches = array();
preg_match_all( '/class="nextEpInfo">(.+):<\/td>\s*<td[^>]*>(\d*)</', $content, $matches );
print_r( $matches );

or similar, which is the simplest and is going to work as far as the site's owner doesn't change the strings. using xpath or other xml/html parser could be an overhead for two strings to match and can brake the same way if the content on the site is changed.

于 2012-11-05T13:08:57.680 に答える