1

Symfony、Goutte、および DOMCrawler を使用してページをスクレイピングしています。残念ながら、このページには昔ながらのデータ テーブルが多数あり、ID、クラス、または識別要素はありません。リクエストから返されたソースコードを解析してテーブルを見つけようとしていますが、情報にアクセスできないようです

フィルタリングしようとすると、最初のノードのみがフィルタリングされ、目的のデータがそこにないため、何も返されないと思います。

だから私は$crawlerオブジェクトを持っています。そして、私が望むものを得るために、以下をループしようとしました:

$title = $crawler->filterXPath('//td[. = "Title"]/following-sibling::td[1]')->each(funtion (Crawler $node, $i) {
        return $node->text();
});

よくわかりませんCrawler $nodeが、Web ページの例から取得したところです。おそらく、これを機能させることができれば、オブジェクト内のノードをループして、$crawler実際に探しているものを見つけることができます。

ページの例を次に示します。

<table> 
<tr>
    <td>Title</td>
    <td>The Harsh Face of Mother Nature</td>
   <td>The Harsh Face of Mother Nature</td>
</tr>
.
.
.
</table>

そして、これは 1 つのテーブルにすぎません。多くのテーブルがあり、この 1 つの外に大きな雑然とした混乱があります。何か案は?

$crawler(注: 以前は、必要な情報に対してオブジェクトにフィルターを適用することができました。次にserialize()、情報を取得し、最終的に文字列を取得しました。これは理にかなっています。しかし、文字列をまったく取得できません。理由はわかりません。)

4

2 に答える 2

1

DomCrawler html() 関数は、関数の説明に従って HTML 全体をダンプしません。

http://api.symfony.com/2.6/Symfony/Component/DomCrawler/Crawler.html#method_html

あなたの場合に行った最初のノードのみを返します。

DomCrawler は SplObjectStorage のセットであるため、http://php.net/manual/en/domdocument.savehtml.phpを使用できる場合があります。

$html = $crawler->getNode(0)->ownerDocument->saveHTML();
于 2015-03-26T02:56:40.220 に答える
0

Crawler::html()のソースを表示すると、次のことを実行していることがわかります。

$html = '';
foreach ($this->getNode(0)->childNodes as $child) {
    $html .= $child->ownerDocument->saveHTML($child);
}
return $html;
于 2015-04-02T18:05:27.247 に答える