0

(編集:私はまだこの問題を解決する方法を見つけていません。$crawlerオブジェクトを扱うのはばかげているようです。特定のテキストを解析したいだけです。それ<td>はどれほど難しいですか?serialize()クローラーオブジェクト全体を作成することもできません。ウェブページのソースコードを文字列に変換するか、そうでなければ私はその文字列を難しい方法で解析することができました.助けてください.私は問題をうまく説明したと思います, 以下.)

以下では、Symfony、Goutte、および DomCrawler を使用して Web ページをスクレイピングしています。私は成功しなかった他の質問を通してそれを理解しようとしてきましたが、今はすべてのコードを投稿して、これをできるだけ簡単にするつもりです.

ページを取得して、探しているデータの最初のビットを取得できます。1 つ目は、javascript から出力された URL であり、and の付いたaタグ内にonclickあり、長い文字列です。そのため、a を使用しpreg_matchてふるいにかけ、必要なものを正確に取得します。

次に必要なデータは、<td>タグ内のテキストです。問題は、この Web ページには 10 ~ 20 の異なる<table>タグがあり、id=""またはclass=""タグがないため、分離するのが難しいということです。だから私がやろうとしているのは、「Event Title」という単語を検索してから、次の兄弟<td>タグに移動し、その innerHtml を抽出することです。これが実際のタイトルになります。

$crawler問題は、2 番目の部分では、オブジェクトを正しく解析できないように見えることです。オブジェクトのバージョンでpreg_match以前に行ったことがわかりませんが、下半分については適切に解析できないようです。serialize()$crawler

$crawler = $client->request('GET', 'https://movies.randomjunk.com/events/EventServlet?ab=mov&eventId=154367');



$aurl = 'http://movies.randomjunk.com/r.htm?e=154367'; // event url beginning string
$gas = $overview->filter('a[onclick*="' . $aurl . '"]');

$string1 = serialize($gas->filter('a')->attr('onclick')); //TEST
$string1M = preg_match("/(?<=\')(.*?)(?=\')/", $string1, $finalURL); 
$aString = $finalURL[0];
echo "<br><br>" . $aString . "<br><br>";
// IT WORKS UP TO HERE


// $title = $crawler->filterXPath('//td[. = "Event Title"]/following-sibling::td[1]')->each(funtion (Crawler $crawler, $i) {
//     return $node->text();
// }); // No clue why, but this doesn't work. 

$html = $overview->getNode(0)->ownerDocument->saveHTML();


$re = "/>Event\sTitle.*?<\\/td>.*?<td>\\K.*?(?=<\\/td>)/s";
$str = serialize($html);
print_r($str);
preg_match_all($re, $str, $matches);
$gas2 = $matches[0];


echo "<pre>";
    print_r($gas2);
echo "</pre>";

Mypreg_matchは空の配列を返します。$crawlerオブジェクトは多くのノードで構成されているため、オブジェクトの検索に問題があると思います。私はそれをすべてhtmlに変換してからaに変換しようとしましたが、うまくいきませんpreg_match。いくつかのprint_rステートメントを実行しましたが、Web ページ全体が返されるだけです。

クローラー オブジェクトの一部の html の例を次に示します。

{lots of other html and tables}
<table> 
    <tr>
        <td>Title</td>
        <td>The Harsh Face of Mother Nature</td>
        <td>The Harsh Face of Mother Nature</td>
    </tr>
    .
    .
</table>
{lots of other html and tables} 

そして、目標は、ページ/オブジェクト全体を解析し、「母なる自然の厳しい顔」$crawlerというタイトルを取得することです。

これが可能であることはわかっていますが、誰かが提供したい唯一の答えは、この時点で約 1000 回読んだ domcrawler ページへのリンクです。助けてください。

4

3 に答える 3

2

上記の html フラグメントを考えると、次の XPath を思いつくことができました。

//table/tr/td[.='Title']/following-sibling::td[1]

ここで提供された html フラグメントを使用して XPath をテストできます。

$html = '<table><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr></table>';
$crawler = new Symfony\Component\DomCrawler\Crawler($html);

$query = "//table/tr/td[.='Event Title']/following-sibling::td[1]";
$crawler->filterXPath($query)->each(function($crawler, $i) {
echo $crawler->text() . PHP_EOL;

});

どの出力:

The Harsh Face of Mother Nature
The Harsh Face of Mother Nature
The Harsh Face of Mother Nature

更新: 以下で正常にテストされました:

$html = '<html><table><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr></table><table><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr></table><table><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr></table></html>';

更新: Web サイトからサンプル html を提供された後、次の XPath を使用して解析することができました。

//td[normalize-space(text()) = 'Event Title']/following-sibling::td[1]

本当の問題は、「イベント タイトル」の前後の空白でした。

于 2015-03-31T23:55:52.347 に答える
0

さて、あなたができることは、あなたのクラスを使用することです:

<td class="mytitle">The Harsh Face of Mother Nature</td>

クローラーをフィルタリングして、次のような配列ですべてのタイトルを取得するために使用します。

$titles = $crawler->filter('td.mytitle')->extract(array('_text'));

ここで、td.mytitle は css セレクターで、mytitle クラスで td を選択し、ノード内のテキストを参照する _text を抽出します。

正規表現よりも簡単で高性能...

このコードはテストしていませんが、動作するはずです。クローラーに関するヘルプと詳細情報は、次の場所で入手できます。

http://symfony.com/fr/doc/current/components/dom_crawler.html

于 2015-03-27T14:20:40.097 に答える